0
点赞
收藏
分享

微信扫一扫

数据库规范

追风骚年 2022-03-14 阅读 83

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_identerprise_id varchar(20) DEFAULT NULL COMMENT ‘企业编号’
总公司编号parent_company_idparent_company_id varchar(20) DEFAULT NULL COMMENT ‘总公司编号’
公司idcompany_idcompany_id varchar(32) DEFAULT NULL COMMENT ‘公司id’
部门iddept_iddept_id varchar(50) DEFAULT NULL COMMENT ‘部门id’
创建时间created_timecreated_time datetime DEFAULT NULL COMMENT ‘创建时间’
更新时间updated_timeupdated_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

举报

相关推荐

0 条评论