本数据库设计规范是以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,才推荐进?分库分表。
说明: 如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。
规约参考
合适的字符存储?度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
正例: 如下表,其中?符号值可以避免误存负数,且扩?了表示范围。