建表规范
1. 【强制】表名不使用复数名词
表名应该仅仅表示表里面的实体内容,不应该表示实体数量。
2. 【强制】禁用保留字
- 如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_time | DATETIME | CURRENT_TIMESTAMP | 创建时间 |
| update_time | DATETIME | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
说明: 可以通过建表语句指定create_time和update_time 无需代码处理。 mysql 5.6+支持多个datetime列自动设置创建时间戳和更新时间戳,版本过小可以自行代码处理
9. 【强制】字符集统一使用utf8mb4
支持emoj表情等
10. 【推荐】涉及到业务的表,数据变更须可追溯
可采用表加 create_user/update_user 字段,或其他更为详细的数据变更记录方案。
| 列 | 类型 | 说明 |
|---|---|---|
| create_user | bigint(20) | 创建者用户ID |
| update_user | bigint(20) | 更新者用户ID |
11. 【推荐】涉及到需要使用乐观锁的场景增加版本字段。
| 列 | 类型 | 说明 |
|---|---|---|
| version | int(10) | 记录版本 |
12. 【强制】is的使用
表达是与否类似的字段,不要使用is开头字段,数据类型是boolean,使用is开头字段使用IDE生成getter和setter方法时会去掉is,将无法正确映射到数据库字段。
正例:deleted 反例:isDelete
13. 【推荐】及时更新注释等
如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
14. 【推荐】字段允许适当冗余,以提高查询性能
但必须考虑数据一致。冗余字段应遵循:
- 不是频繁修改的字段。
- 不是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中的常量命名方式(大写字
母,单词间使用_连接),建议使用标准易懂的英文单词。例如:
| 列 | 类型 | 说明 |
|---|---|---|
| status | varchar(32) | 状态,如todo、doing、done等 |
| type | varchar(32) | 类型,如android\ios等 |