1、表命名规范
约定:表名由前缀和实际名字组成。
前缀:使用小写字母tb_,代表表。实际名字中,一个系统尽量采取同一单词,多个后面加_来连接区分。
因此,合法的表名类似如下。
tb_member
2、避免保留字
表以单数形式名词或名词短语命名。如果表名仅有一个单词,那么建议不使用缩写,而是用完整的单词。
主键:PK_<表名>
外键:FK_<表名>_<主表名>_<外键字段名>
索引:IDX_<表名>_<构成索引的字段名>
如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。
3、字段设计规范
(1)避免下划线连接 、避免名称过长 、避免保留字
(2)选择更简单的数据类型。例如,比较整数的代价小于比较字符,因为字符集和排序规则使字符比较更复杂。
(3)尽可能把字段定义为NOT NULL。对于字段能否NULL,应该在SQL建表脚本中明确指明,不应使用缺省。
(4)一个表中的字段不要太多,理论上不要超过80个。
(5)数据库中所有布尔型中数值0表示为假;数值1表示为真
(6)当字段定义为字符串类型时使用VARCHAR2而不用NVARCHAR
(7)字段尽可能有默认值,字符型的默认值为一个空字符值串,数字型的默认值为数值0。
4、键设计规范
(1)为关联字段创建外键。
(2)所有的键都必须唯一。
(3)尽可能避免使用复合键。
(4)外键总是关联唯一的键字段。
(5)尽可能使用系统生成(如序列SEQUENCE产生)的主键。
(6)可选键有时可做主键。
(7)一个表中组合主键的字段个数尽可能少。
5、索引设计规范
(1)如果一列出现在表达式或函数中,不会使用该列上的索引
(2)要索引外键
(3)对于索引选择性高的列使用B-Tree索引
(4)对于索引选择性低的列使用位图索引
(5)HASH索引只适用于相等比较
(6)不要索引大型字段(有很多字符的字段)
(7)不要索引常用的小型表
建议:
创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为 InnoDB
创建表时必须显式指定字符集为 utf8 或 utf8mb4。
建议对表里的 blob、text 等大字段,垂直拆分到其它表里,仅在需要读这些对象的时候才去 select
建议对表里的 blob、text 等大字段,垂直拆分到其它表里,仅在需要读这些对象的时候才去 select。
反范式设计:把经常需要 join 查询的字段,在其它表里冗余一份。如 username 属性在 user_account,user_login_log 等表里冗余一份,减少 join 查询。