数据模型的重要性
数据模型是对业务的抽象,是灵魂
- 在执行项目前,数据模型应该经过评审,评审人员一般邀请项目组长、产品经理、前端人员、测试人员
- 数据模型一般由服务端程序员设计,要严格遵循团队数据库设计规范
- 产品经理、测试人员虽然不是技术人员,但是需要掌握数据库知识,技术团队会开放测试环境数据库,要在测试过程中,能看懂数据流转
- 数据库设计时,一定要把备注写清楚,尤其是枚举值类的字段,一般情况下,我们建议枚举值要有含义,不要使用 0、1、2 等无含义的值
红线规范
以下的基础规范属于应知应会,在任何项目中都要遵循
表的定义
以下是团队的基础原则
- 不使用复数名词,例如用户表叫做 sys_user,不要叫做 sys_users;商品不要叫做 goods,单数、复数是一个
- 禁用保留字,例如 desc, range, match, delayed
- 表名一般会加个前缀,证明为同一类业务,例如
sys_
(全称:system)前缀代表系统相关的表,例如 sys*user、sys_province_city 等;oms*
(全称:order management system)前缀代表订单管理系统,例如 oms_order、oms_sub_order 都加 oms 的前缀,前缀一般 3 个字母组成 - 关联表要写清楚关联关系,例如:用户所属部门表
sys_user_unit
为用户表sys_user
和部门表sys_unit
组成 - 表的主键定义为去掉前缀表名+id,例如
sys_user
表的主键名为user_id
,oms_order
表的主键为order_id
字段的定义
- 字段名不要用保留字,如果是 0、1 类的值,一般命名为
is_xxx
或者xxx_flag
,例如 deleted_flag 或者 is_deleted;如果是状态、类别之类的则定义为xxx_status
或者xxx_type
,请注意一般情况下,我们的字段都设计为 varchar(255),稍微长点没关系 - 我们团队定义为,主键用 int(11)、金额用 decimal(10,2)、一般字段用 varchar(255)、经纬度用 double(10,10)
- 如果字段为 json,则需要命名为
xxx_json
,类型为 json;如果存储 html,则需要命名为xxx_html
,类型为 mediumText; - 一般情况下,状态类、枚举类的值,都应该设置默认值,默认值就是初始化的值
- 一些常被检索的字段、跨表关联的字段,需要建立索引,索引的命名规则为
idx_字段名
,例如订单里面的支付状态字段为 pay_status,定义索引名为 idx_pay_status - 主键统一定义为表名(去前缀)+
_id
,例如 sys_user,则主键为 user_id;oms_order,则主键定义为 order_id。另外,主键要求 int(11),自增模式 - 关联主键要写全,例如订单中有用户的字段,那么 oms_order 表要有 user_id,让我看到 user_id 能够了解是 sys_user 表的 id,如果 oms_order 还有一个分享人的 id,那么应该起名叫做 share_user_id,总之如果是 sys_user 表的 id,就一定要以
user_id
结尾 - 部分字段如有必要,需要给默认值,例如 status="1"、deleted_flag="0"、sort=99
字段的备注
我们单独拿出一个小节来说明数据库字段备注的重要性
备注应该遵循的原则
首先,所有的字段都应该有备注,那么:
- 主键的备注统一叫做 PK,即 primary key
- 枚举值类的备注(例如类型、状态)必须写全,例如审核状态字段为 audit_status,则备注写为
审核状态,WAITING:待审核;APPROVED:审核通过;REJECTED:审核驳回
,对应的枚举值也要一致,如果增减枚举值,也要同步修改备注
备注会有什么作用?
jCoder 生成的代码注解全部依赖于数据库的备注
尤其是接口文档,依赖于备注生成,因此我们的开发过程是在前期梳理业务、形成产品文档、设计数据模型
、进行开发、测试验收、部署上线,业务设计不单纯是数据库设计——单这里单独提出,说明其重要性
数据库的设计必须找项目经理/组长评审,希望大家提升对数据模型的理解能力
通用字段
要求全部的库表设计时,都要包含以下通用字段,在服务端有 CommonEntity 做映射
我们全部的库表都要有以下字段:
字段 | 类型 | 允许空 | 默认 | 注释 |
---|---|---|---|---|
sort | int(11) | NO | 99 | 值越大越靠前 |
status | varchar(32) | NO | 1 | 状态,0:失效;1:有效 |
note | text | YES | NULL | 备注信息 |
version | int(11) | YES | 0 | 版本号,并发处理时用 |
deleted_flag | tinyint(6 ) | NO | 0 | 软删除标识,0:未删除;1:已删除 |
created_at | datetime | YES | NULL | 创建时间 |
created_by | int(11) | YES | NULL | 创建人 |
updated_at | datetime | YES | NULL | 更新时间 |
updated_by | int(11) | YES | NULL | 更新人 |
deleted_at | datetime | YES | NULL | 删除时间 |
deleted_by | int(11) | YES | NULL | 删除人 |