设计数据库规范
程序员文章站
2023-12-30 19:21:34
...
数据库设计规范
建库/表/列规范
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>