基础知识 - 数据库设计

[color=blue][b]基于Data设计Schema、基于Query设计Index![/b][/color]

首先要了解RDBMS vs. NoSQL、OLTP vs. OLAP的区别,然后要掌握以下必备知识,也可以Google一下“Database Best Practices”看看别人的经验总结。

[b]必备理论知识[/b]
[list][*]范式:Database Normalisation
[*]反模式:Database Anti-Patterns/Denormalization
[*]分库分表:Shard(Partition)
[*]数据冗余:Data Redundancy
[*]科德十二定律:Codd's 12 Rules[/list]
[b]命名规则 (Naming Conventions)[/b]
0)基本规则
[list][*]全部小写
[*]下划线分割单词(只使用字母,数字和下划线)
[*]避免使用无意义的数字
[*]避免使用保留字/关键字
[*]名称要简单且具有描述性
[*]使用英语不要用拼音[/list]
1)表名
[list][*]表名用单数
[*]2到3个单词
[*]最长30字符
[*]避免缩写简写(如果单词很长可以使用常用简写比如i18n)
[*]关联表使用相同前缀单词 比如:activity_status, activity_type
[*]避免无意义的前缀(t_、tbl_、TB_、VW_、SP_)
[*]避免应用名前缀(MyApp_User、MyApp_Teams)[/list]
--migration用的schema_version表(当前版本,最近更新时间等)
--编码表/字典表/全局设置表(国家、城市、货币等)

2)字段名
[list][*]是否应该全数据库唯一?
[*]标示表的前缀?
[*]单字段主键最好用id
[*]外键字段<TableName>_id
[*]日期字段xxx_date
[*]时间字段xxx_time
[*]布尔字段is_xxx 或 has_xxx
[*]避免数据类型后缀(name_tx、date_dt)[/list]
--合理选择数字Number、时间Date的类型
--不要存储图像等blob数据(必须的话不要放入频繁访问的表中)
--合理设置列的宽度(使用英语以外的语言时考虑编码)
--用UTC的方式存储日期与时间
--常用字段(ID、状态、删除标志、创建者、创建时间、更新者、更新时间)
--姓名字段考虑外国人时要分开
--主键最好为整型值
--越少越好(表的个数、字段个数、主键的字段个数)
--在冗余和速度之间找平衡

[b]以下是一些设计时常见的数据结构:[/b]

[b](一)可扩展的数据模型 Extensible Data Modeling[/b]
http://www.slideshare.net/billkarwin/extensible-data-modeling
避免ALTER TABLE,常用于:CMS、EC。
1)预留字段Extra Columns
2)属性表Entity-Attribute-Value:EAV模型(metadata、attributes、entities、attribute_values)
3)序列化字段Serialized LOB & Inverted Indexes(XML/JSON/YAML等)
4)表继承Class Table Inheritance
需要权衡以下内容:
灵活性Flexible、检索Select、过滤Filter、索引Indexed、数据类型DataTypes、约束Constraints(NOT NULL、外键、唯一约束等)。

[b](二)基于角色的访问控制 RBAC(Role-Based Access Control)[/b]
用于用户权限管理:用户Users、用户组Groups、角色Roles、目标Objects、访问模式Access Mode、操作Operator。
http://rongxh2010.iteye.com/blog/930648

[b](三)层次数据 Hierarchical Data[/b]
用于分类、组织、文件夹等。
动态菜单Dynamic Menus的设计。
http://www.slideshare.net/billkarwin/models-for-hierarchical-data
http://www.slideshare.net/ehildebrandt/trees-and-hierarchies-in-sql
http://www.sitepoint.com/hierarchical-data-database/

[b](四)ID/PK的生成策略[/b]
http://rensanning.iteye.com/blog/2149685

[b](五)密码的存储 Password[/b]
http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database

[b](六)多语言 Multi-Language[/b]
多个表,多个字段、多个记录、额外的表
http://www.cnblogs.com/studyzy/archive/2013/04/03/2998322.html
http://stackoverflow.com/questions/316780/schema-for-a-multilanguage-database

[b](七)标签 Tags[/b]
http://tagging.pui.ch/post/37027745720/tags-database-schemas

[b](八)历史数据 Historical/Archive/AuditTrail[/b]
Row级别、Column级别、Log表(操作日志,登录日志)
http://www.codeproject.com/Articles/105768/Audit-Trail-Tracing-Data-Changes-in-Database
http://database-programmer.blogspot.com/2008/07/history-tables.html

[b](九)工作流 Workflow[/b]
http://www.exceptionnotfound.net/designing-a-workflow-engine-database-part-1-introduction-and-purpose/

[b](十)信息流/通知 Feeds/Notification/Message[/b]
http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html

[b](十一)状态标识位 Flags/Indicators/Enumeration[/b]
单列
true/false VARCHAR(4) boolean
yes/no VARCHAR(3)
Y/N CHAR(1)
0/1 CHAR(1) INT
*** 常见的是以int定义居多。

多列
多个字段:同一张表中添加多个标识列定义通单列
1个字段:二进制位的字段(1101:13)

[b](十二)第三方登录 Third-Party Signin[/b]


比较早的一份数据库设计指南[url=http://dl.iteye.com/topics/download/8a0f0fde-03ea-3a23-8da8-1e39fdd64662]TechRepublic database design guide[/url],主要针对Access的,可以用来参考。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值