本数据库设计规范是以MySQL数据库为基准,主要分为4个部分,即建表规约、索引规约、SQL 语句和ORM 映射。其中,将阐述在建表过程中的要求和约定,例如数据库名称、表名称、视图名称以及字段名称和数据类型等建议,以及规范索引的创建和使⽤规则,同时将说明编写SQL语句的⽅法,SQL结构、字段别名、表别名使⽤等,最后还将描述如何在ORM中进⾏数据库表映射等。
建表规约
强制要求
1. 表达是/否概念的字段,必须使⽤ is_xxx 的⽅式命名,数据类型是 unsigned tinyint (1 表示
是, 0 表示否)。
说明: 任何字段如果为⾮负数,必须是 unsigned。
正例: 表达逻辑删除的字段名 is_deleted, 1 表示删除, 0 表示未删除。
2. 表名、字段名必须使⽤⼩写字⺟或数字,禁⽌出现数字开头,禁⽌两个下划线中间只出现数字。
说明: MySQL 在 Windows 下不区分⼤⼩写,但在 Linux 下默认是区分⼤⼩写。因此,数据库
名、表名、字段名,都不允许出现任何⼤写字⺟,避免节外⽣枝。
正例: hap_admin, rdc_config, level3_name
反例: HapAdmin, rdcConfig, level_3_name 数据库字段名的修改代价很⼤,因为⽆法进⾏
预发布,所以字段名称需要慎重考虑。
3. 表名不使⽤复数名词。
说明: 表名应该仅仅表示表⾥⾯的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形
式,符合表达习惯。
4. 禁⽤保留字,如 desc、 range、 match、 delayed 等, 请参考 MySQL 官⽅保留字。
5. 主键索引名为 pk_字段名; 唯⼀索引名为 uk_字段名; 普通索引名则为 idx_字段名。
说明: pk_ 即 primary key; uk_ 即 unique key; idx_ 即 index 的简称。
6. ⼩数类型为 decimal,禁⽌使⽤ float 和 double。
说明: float 和 double 在存储的时候,存在精度损失的问题,很可能在值的⽐较时,得到不正确
的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和⼩数分开存储。
7. 如果存储的字符串⻓度⼏乎相等,使⽤ char 定⻓字符串类型。
8. varchar 是可变⻓字符串,不预先分配存储空间,⻓度不要超过5000,如果存储⻓度⼤于此值,定义字段类型为 text,独⽴出来⼀张表,⽤主键来对应,避免影响其它字段索引效率。
说明: 该表的命名以 原表名_字段缩写 的格式命名。
9. 表必备字段: id、create_time、update_time、create_by、update_by、
object_version_number。也可以叫做who字段,就是每个表⾥必须具备的字段。这些字段起到似
metadata的作⽤。这些字段的作⽤很⼤,例如,数据分析的时候,可以使⽤update_time作为数据抽取的时间戳字段等。
id 必为主键,类型为 unsigned bigint、单表时⾃增、步⻓为 1。create_time 是此条数据的创建时间,数据类型为datetime 类型。update_time是此条数据的最后更新时间,数据类型为 datetime 类型。create_by是此条数据的创建⼈,数据类型为unsigned bigint类型。update_by是此条数据的最后更新⼈,数据类型为unsigned bigint类型。object_version_number是此条数据的版本号,如果启⽤数据库数据版本控制,则会使⽤到此数据。
以下是基于MySQL数据库的创建脚本,可供参考。
column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue:
"1")
column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0")column(name: "creation_time", type: "DATETIME", defaultValueComputed:
"CURRENT_TIMESTAMP")
column(name: "updated_by", type: "BIGINT UNSIGNED", defaultValue: "0")column(name: "update_time", type: "DATETIME", defaultValueComputed:
"CURRENT_TIMESTAMP")
10. 表的命名最好是加上业务名称_表的作⽤。
正例: kanban_task 、 devops_project 、 website_config
推荐规约
1. 数据库名称或者编码与应⽤名称或者编码尽量⼀致。
2. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
3. 字段允许适当冗余(所谓冗余是指在不同的表⾥⾯存储相同的字段),以提⾼查询性能,但必须考虑数据⼀致。冗余字段应遵循:
不是频繁修改的字段。不是 varchar 超⻓字段,更不能是 text 字段。
正例: 商品类⽬名称使⽤频率⾼, 字段⻓度短,名称基本⼀成不变, 可在相关联的表中冗余存储
类⽬名称,避免关联查询。
4. 单表⾏数超过 500 万⾏或者单表容量超过 2GB,才推荐进⾏分库分表。
说明: 如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。
规约参考
合适的字符存储⻓度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
正例: 如下表,其中⽆符号值可以避免误存负数,且扩⼤了表示范围。
几种数字类型说明