数据库表设计规范

变更历史

日期 变更人 变更说明
2019-12-25 truesnow 第一版

目标

统一数据库表的命名规范。避免前端、测试、业务方等在对接不同后端开发人员开发的服务时,对相同、相似的概念使用不一样的名称,造成疑惑,进而增加对接难度。

规范

数据库命名规范

例如:

  • 支付中心:使用 pay_ 为前缀
  • 用户中心:使用 user_ 为前缀
    • 用户触达服务:user_push_db
    • 白名单服务:user_white_list_db
  • 活动中心:使用 activity_ 为前缀
    • 拼团服务: activity_group_buy_db
    • 特价促销服务:activity_special_price_db
    • 秒杀服务:activity_seckill_db

数据表命名规范

如:

  • 活动表:t_activity
  • 订单表:t_order
ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='表名';

索引规范

INDEX `idx_update_time` (`update_time`)

说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90% 以上, 可以使用 count(distinct left(列名, 索引长度))/count(*) 的区分度来确定。

字段规范

字段命名规范

字段注释规范

字段类型规范

反例:库存未设置 unsigned,库存可为负,商品超卖;订单金额未设置 unsigned,订单为负仍下单成功

理由是与业务或前端交互时,例如,在 PB 中,即使前端未传 status 字段,PB 也会将参数 status 值设为默认值 0,如果此时 status 为 0 有实际意义,那么这里查询就有歧义了,无法查询所有状态,而如果 status 为 0 无意义,后端可判断 status 为 0 时不按 status 搜索。

如:删除状态字段 del_status,0 表示未删除,1 表示已删除,前端与接口中不会按删除状态查询;库存释放状态字段 stock_release_status,0 表示未释放,1 表示已释放,这个状态是服务内部标识字段,只有服务内部会使用,前端与接口不会关心。

如:活动开始时间、活动结束时间等,因为所有字段都必须为 NOT NULL,当时间字段为非必填时,timestamp 不好设置默认值。例如,下线操作需记录下线时间,数据创建时下线时间应为空,如为 timestamp 类型则不得不设置一个默认值,而设置为 int 类型,则可设置其默认值为 0。

字段设计规范

1)不是频繁修改的字段 2)不是 varchar 超长字段,更不能是 text 字段

正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。

公共字段定义

即每个表都应设置的字段,包括:

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
`del_status` tinyint(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除状态(0:未删除;1:已删除)',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

示例:

CREATE TABLE `t_activity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(128) NOT NULL DEFAULT '' COMMENT '活动名称',
  `del_status` tinyint(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除状态(0:未删除,1:已删除)',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活动表';

常用字段定义

`start_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '活动开始时间',
`end_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '活动结束时间',
`ordinal` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '排序值',

Tagged .