0、前置说明
费控系统的数据库会部署到不同的环境中,要适配:mysql、oracle、postgresql、达梦数据库。
所以我们做数据库设计时,一定要考虑到多种数据库的情况,尽量使用sql标准语法,不要使用一些数据库特有的语法、函数、类型等等数据库对象。
1、命名规范
以下命名规范对表、视图、列、索引均进行限制。
1.1 禁用拼音
命名标识符不允许使用拼音。
1.2 长度限制
命名标识符长度不允许超过30个字符。
数据库标识符长度限制
1.3 保留字限制
命名标识符不允许使用数据库的保留字。
2、表设计规范
2.1 示例
CREATE TABLE `flsc_seckilling_reminder` (
`id` varchar(32) NOT NULL COMMENT '主键',
`seckilling_id` varchar(32) DEFAULT NULL COMMENT '秒杀ID 参考flsc_seckilling表ID主键',
`user_id` varchar(32) DEFAULT NULL COMMENT '用户Id',
`enterprise_id` varchar(20) DEFAULT NULL COMMENT '企业编号',
`parent_company_id` varchar(20) DEFAULT NULL COMMENT '总公司编号',
`dept_id` varchar(50) DEFAULT NULL COMMENT '部门id',
`company_id` varchar(32) DEFAULT NULL COMMENT '公司id',
`remind_status` varchar(2) DEFAULT NULL COMMENT '提醒状态(1.待提醒 2.提醒成功 3.提醒失败),参考枚举RemindStatusEnum',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `seckilling_id` (`seckilling_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单模块_秒杀商品表';
2.2 表名
2.2.1 表名格式
数据库中的表只有两种,实体表、实体与实体之间关联表
实体表格式:产品线_模块_实体, 例如:flsc_seckilling_reminder
产品线=flsc, 模块=seckilling, 实体=reminder
实体与实体之间关联表格式:产品线_模块_实体1_实体2_rel
反例:如果一个数据库中所有表名的前缀一样,则没有必要使用前缀,如一个数据库中所有表名前缀都是ve_ 、fk_,这就没有必要了。
2.2.2 表主键规范
表一定要包含一个非业务主键
-- 当数据量不大,不进行按照id排序时,用varchar(32)可以
`id` varchar(32) NOT NULL COMMENT '主键'
-- 当数据量有点大时,有按照id排序的需求、id的排序效果与created_time排序效果一致,此时用bigint更合适,所以没有特殊要求推荐使用bigint
`id` bigint NOT NULL COMMENT '主键'
2.2.3 表存储引擎规范
强制使用InnoDB存储引擎。InnoDB存储引擎的优点请自行查阅。
2.2.4 表字符集规范
mysql数据库强制使用utf8mb4字符集,utf8mb4字符集可以支持表情。没有utf8mb4字符集的数据库强制使用utf8字符集。
2.2.5 表注释规范
按照表名命名格式进行注释,例如:flsc_seckilling_reminder,注释为:福利商城_秒杀_提醒表
2.2.6 表必包含列规范
表中一定要包含创建时间、更新时间两列,业务上排序、排查问题、运维同步数据这两列都非常重要
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_time` datetime DEFAULT NULL COMMENT '更新时间',
3、列设计规范
3.1 示例
CREATE TABLE `flsc_seckilling_reminder` (
`id` varchar(32) NOT NULL COMMENT '主键',
`seckilling_id` varchar(32) DEFAULT NULL COMMENT '秒杀ID 参考flsc_seckilling表ID主键',
`user_id` varchar(32) DEFAULT NULL COMMENT '用户Id',
`enterprise_id` varchar(20) DEFAULT NULL COMMENT '企业编号',
`parent_company_id` varchar(20) DEFAULT NULL COMMENT '总公司编号',
`dept_id` varchar(50) DEFAULT NULL COMMENT '部门id',
`company_id` varchar(32) DEFAULT NULL COMMENT '公司id',
`remind_status` varchar(2) DEFAULT NULL COMMENT '提醒状态(1.待提醒 2.提醒成功 3.提醒失败),参考枚举RemindStatusEnum',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `seckilling_id` (`seckilling_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单模块_秒杀商品表';
3.2 列命名规范
要做到见名知意,同时遵守*命名规范*
3.3 列数据类型规范
列数据类型,请合理使用数据类型,即要满足功能性需求、又要考虑非功能性需求。特别是文本类型,不要长度设置过大,避免浪费空间。
不同数据库支持的数据类型 mysql,oracle
3.4 列默认值/非空约束规范
【推荐】字段定义为NOT NULL,并有默认值。数据库列上如果建有索引,但是查询条件用is null 或者 is not null,就会进行全表扫描。
所以强烈推荐,设计列的时候,字段定义为NOT NULL,并有默认值。
3.5 列注释规范
`remind_status` varchar(2) DEFAULT NULL COMMENT '提醒状态(1.待提醒 2.提醒成功 3.提醒失败),参考枚举RemindStatusEnum'
- 列注释要清晰明了
- 如果该列是有限的几个枚举值,则一定要注释清楚,并写出程序代码中的对应的枚举类
- 如果枚举值有变更,则检举类与列注释要保持同步更新
- 列注释中不允许包含单引号(英文半角)、分号(英文半角)
3.6 列排序规则规范
列排序规则主要针对的是文本类型:char 、varchar、text等类型。列字符集如果用utf8mb4,则排序规则为utf8mb4_bin,
utf8mb4_bin是支持区分大小写的,这很重要。如遇到特殊情况,再咨询。
3.7 通用字段规范
公司通用的字段,如企业编号、成本中心、员工Id等,在各个业务表中必须保持严格一致
中文名称 | 英文名称 | sql脚本 |
---|---|---|
企业编号 | enterprise_id | enterprise_id varchar(20) DEFAULT NULL COMMENT ‘企业编号’ |
总公司编号 | parent_company_id | parent_company_id varchar(20) DEFAULT NULL COMMENT ‘总公司编号’ |
公司id | company_id | company_id varchar(32) DEFAULT NULL COMMENT ‘公司id’ |
部门id | dept_id | dept_id varchar(50) DEFAULT NULL COMMENT ‘部门id’ |
创建时间 | created_time | created_time datetime DEFAULT NULL COMMENT ‘创建时间’ |
更新时间 | updated_time | updated_time datetime DEFAULT NULL COMMENT ‘更新时间’ |
4、索引规范
4.1 示例
4.2 创建索引时机
- 创建表时:当创建表的时候,要思考业务中经常进行查询where条件字段是什么,是否应该创建索引
- sql优化时:当进行sql优化时,可能需要结合执行计划,来创建索引
4.3 索引命名规范
mysql索引命名规范
主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
oracle索引命名规范
主键索引名为 pk_表名_字段名;唯一索引名为 uk_表名_字段名;普通索引名则为 idx_表名_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
oracle对索引的命名空间是全局的,同一个schema下的索引不允许重名。
4.4 索引类型
mysql提供的索引类型有normal、unique、fulltext、spatial.没有特殊需求,我们都使用normal和unique。如遇到特殊情况,再咨询。
4.5 索引方法
mysql提供的索引方法有B-Tree、Hash、R-Tree.没有特殊需求,我们都使用B-Tree。如遇到特殊情况,再咨询。
4.6 索引注释
mysql是支持对索引进行注释的,如果说明此索引的应用场景。
5、参考文档
《Java开发手册》v1.5.0 华山版.pdf