四时宝库

程序员的知识宝库

数据库设计规范——1.建表规约(数据库建表规则)

本数据库设计规范是以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,才推荐进?分库分表。

说明: 如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

规约参考

合适的字符存储?度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。

正例: 如下表,其中?符号值可以避免误存负数,且扩?了表示范围。


发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接