数据库设计规范

  • 建库/表/列规范
  • 1.总体规范
  • 2. 数据库名
  • 3. 表
  • 4. 属性(列或字段)
  • 5. 索引
  • SQL编写规范
  • 常用SQL语句编写基本规范
  • 1.SELECT语句
  • 2.INSERT语句
  • 3.UPDATE语句
  • 4. DELETE语句


建库/表/列规范

1.总体规范

  • 名称长度不超过32个字符;
  • 名称采用英文单词、英文单词缩写、和数字,单词之间使用下划线分割(列采用驼峰式);
  • 数据库对象名称首字母必须小写;
  • 不得采用“_”作为名称的起始字母和终止字母;
  • 名称必须望文知意;
  • 名称不得与数据库管理系统保留字冲突;
  • 不要在对象名的字符之间留空格;
  • 数据库编码统一用utf8mb4,禁止使用utf8。

注意:MySQL 在 Windows 下不区分大小写,但在Linux 下默认是区分大小写。因此,数据库名、表名,都不允许出现任何大写字母,避免节外生枝。

2. 数据库名

  • 数据库名定义为系统名+模块名,或直接采用系统名;
  • 数据库名称全部采用小写;

3. 表

表命名需遵循以下原则:

  • 整个表名不要超过32个字符;
  • 表名不使用复数名词;
  • 推荐表名格式:(模块名)+(关联实体)+业务实体+(作用)。例如:system_user_setting_config;
  • 表名全部采用小写下划线分割;
  • 推荐实体关系强相关的表之间用同样的表名前缀,方便区分模块和实体之间的关系(例:account、account_setting、account_focus);
  • 表注释必须填写,用于说明该表的作用(选中表右键设计表,选择注释tab选项填写);
  • 表字段数无特殊情况应不超过30个;
  • 不使用数据库外键,由应用程序保证;
  • 每个表必须有唯一主键,可以适当使用联合主键,对于字符串做主键的,长度不能超过32。

**
**

4. 属性(列或字段)

属性命名遵循以下原则:

  • 采用有意义的列名,为实际含义的英文单词,且字符间不加任何分割符;
  • 属性名前不要加表名等作为前缀;
  • 不要使用ID、DESC等与系统保留关键字冲突的单词作为列名;
  • 属性名采用驼峰命名法;
  • 每个属性列除创建时间、更新时间外都必须写好注释。

5. 索引

  • 唯一索引以UQ_开头+列名,普通索引以IDX_开头+列名,多列之前用下划线隔开;
  • 单表索引数尽量不要超过五个;
  • 对于索引列,不能设置为允许为NULL,可以统一设置一个默认值,例如对于字符串设置为default或者字符串NULL,对于int类型设置为-1或0。

SQL编写规范

  • 【推荐】所有SQL关键字大写,属性列/表名用``包含,防止可能出现的关键字冲突。
  • 【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的 标准统计行数的语法,数据库无关,跟 NULL 和非 NULL 无关。

说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。(引自阿里规范)

  • 【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。(引自阿里规范)
  • 【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。(引自阿里规范)
  • 【推荐】SQL语句中,列名之后逗号与列名之间不需要用空格隔开,列名之间需要用空格隔开。
  • 【强制】在表查询中,不能对条件列使用函数或者计算,可以对条件值使用函数或计算。
  • 【推荐】条件值在200左右内,可以使用IN,超过200使用EXISTS代替IN,使用NOT EXISTS代替NOT IN。
  • 【推荐】某些情况下(使用索引列),使用UNION代替OR。
  • 【强制】超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致,且多表关联查询时,保证被关联的字段需要有索引(引自阿里规范)。

说明:某些不频繁更新的字段,可以适当采取字段冗余的方式,来减少表之间的联接。

  • 【强制】表达是与否概念的字段,必须使用 xxxState 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)(引自阿里规范)。

说明:任何字段如果为非负数,必须是 unsigned。

正例:表达逻辑删除的字段名 deletedState,1 表示删除,0 表示未删除。

常用SQL语句编写基本规范

1.SELECT语句

(1)将SELECT语句分为五个部分:

  • 由SELECT 开头,后跟一个显示查询结果的列表;
  • 由FROM 开头,后跟一个或多个获取数据所涉及的表;
  • 由WHERE 开头,后跟一个或多个确定所需值的条件;
  • 由GROUP BY开头,后跟一个或多个表列名,通过这些列以对查询结果进行汇总;
  • 由ORDER BY开头,后跟一个或多个表列名,通过这些列以对查询结果进行排序

(2)每个部分分行编写,将每一行的第一个关键字与第一行的SELECT尾部对齐,每个部分之间需要多行书写时需缩进一个tab符(4个空格符),如:

SELECT `column1`, `column2`, `column3`
		FROM table
		WHERE `column1` = 1
		GROUP BY `column1`
		ORDER BY `column3`

(3)将语句中WHERE 和AND 部分格式化,换行需要缩进一个tab符(4个空格),书写布局类似于

WHERE `column1` = ‘’ AND `column2` = ‘’
    AND `column3` = ‘’

(4)语句中出现括号时(非函数方法,例如子查询、and之后的多条件or查询等),必须换行,如:

SELECT `column1`, `column2`, (
		        SELECT COUNT(1)
		        FROM table
		    ) AS `column3`
		FROM table
		WHERE `column1` = ‘’ AND (
		    `column2` LIKE ‘’
		    OR
		    ‘column’ LIKE ‘’
		)

2.INSERT语句

INSERT INTO table (`column1`, `column2`)
	VALUES (<column1Value>,<column2Value>)

3.UPDATE语句

UPDATE table
	SET `column1` = <column1Value>, `column2` = <column2Value>
	WHERE `column` = <columnValue>

4. DELETE语句

DELETE FROM table
	WHERE `column1` = <column1Value>