数据库--mysql建表规范参考

482 阅读4分钟

建表规范

1. 【强制】表名不使用复数名词

表名应该仅仅表示表里面的实体内容,不应该表示实体数量。

2. 【强制】禁用保留字

  1. 如desc、range、match、delayed等,请参考MySQL官方保留字。

3. 【强制】数据表名至少分为两部分:前缀 + “_” + 表含义,驼峰命名法。

正例: crm_user_info 、crm_user

反例:crmuser、crmUser

4. 【强制】数据字段名同表名,采用“_”分隔,更容易读懂字段的含义。

正例:update_time、next_node

反例:nextNode

5. 【强制】数据库、数据表、数据字段的取名必须带有具体含义

除非常识性约定,否则不允许缩写。数据库表和字段都必须有明确的注释。

正例:user_name 注释:用户名、sign_money 注释:签约金额

反例:uName 无注释、sMoney 注释:金额

6. 【强制】主键 唯一键 索引

主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名。 说明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的简称。

7. 【强制】字符串类型的使用

varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

8. 【强制】每个数据库表必须增加以下字段。

类型默认值说明
create_timeDATETIMECURRENT_TIMESTAMP创建时间
update_timeDATETIMECURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP更新时间

说明: 可以通过建表语句指定create_time和update_time 无需代码处理。 mysql 5.6+支持多个datetime列自动设置创建时间戳和更新时间戳,版本过小可以自行代码处理

9. 【强制】字符集统一使用utf8mb4

支持emoj表情等

10. 【推荐】涉及到业务的表,数据变更须可追溯

可采用表加 create_user/update_user 字段,或其他更为详细的数据变更记录方案。

类型说明
create_userbigint(20)创建者用户ID
update_userbigint(20)更新者用户ID

11. 【推荐】涉及到需要使用乐观锁的场景增加版本字段。

类型说明
versionint(10)记录版本

12. 【强制】is的使用

表达是与否类似的字段,不要使用is开头字段,数据类型是boolean,使用is开头字段使用IDE生成getter和setter方法时会去掉is,将无法正确映射到数据库字段。

正例:deleted 反例:isDelete

13. 【推荐】及时更新注释等

如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

14. 【推荐】字段允许适当冗余,以提高查询性能

但必须考虑数据一致。冗余字段应遵循:

  1. 不是频繁修改的字段。
  2. 不是varchar超长字段,更不能是text字段。

15.【推荐】分库分表原则

分库分表原则建议: 1、单节点超过1kw,或者数据量与用户规模等正相关,增长率可预见较高需要分库分表。 2、单节点如果负载较高或者qps较高(读qps 2w+,写tps持续 2k+) ,也需要进行分库分表。 3、数据表是否可以找到使各分区数据量比较均衡的分区字段。 4、查询SQL是否包含复杂SQL,决定了能不能分库分表。如果不做优化,可能不能分库分表哦。

16. 【强制】外键原则

不得使用外键与级联,一切外键概念必须在应用层解决。

17. 【参考】数据库列必须 not null,并设置默认值。

说明:虽然MySQL可以在含有null的列上使用索引,但不代表null和其他数据在索引中是一样的。

不建议列上允许为空。最好限制not null,并设置一个默认值,比如0和''空字符串等,如果是datetime类型,可以设置成'1970-01-01 00:00:00'这样的特殊值。

对MySQL来说,null是一个特殊的值,不能使用=,<,>这样的运算符,对null做算术运算的结果都是null,count时不会包括null行等,null比空字符串需要更多的存储空间等。

18. 【推荐】 枚举

表中的枚举字段需使用varchar,而不是数字类型(如int、tinyint等),这样便于查询时直接看字段值就知道各个值的含义,而不像1、2、3类似的数字需要特殊的注释说明。字段值遵循Java中的常量命名方式(大写字

母,单词间使用_连接),建议使用标准易懂的英文单词。例如:

类型说明
statusvarchar(32)状态,如todo、doing、done等
typevarchar(32)类型,如android\ios等