数据库设计

这一生的挚爱 提交于 2019-11-27 15:59:58

toB 应用设计系列 - 导航

适用范围

本文仅适用于 mysql 数据库

原则

  • 数据库只做存储使用, 计算 / 业务逻辑放到应用层
  • 尽量遵循三范式

高级功能

  • 禁止使用触发器 / 存储过程 / 函数 / 视图

触发器非常影响插入 / 更新 / 删除 的效率, 触发器的功能可由应用层来实现
一旦放开存储过程/函数的限制, 不能保证人们会用存储过程/函数来做什么, 极有可能在存储过程/函数里进行大量的运算, 或者将业务逻辑写入; 另外, 大多数缓存在应用层实现, 存储过程/函数就无法复用缓存
触发器 / 存储过程 / 函数 / 视图 没有版本管理

字段

通用字段

  • 主键id: 尽量使用单一逻辑主键, 实体使用单一逻辑主键, 关联关系可使用复合主键; 坚决不使用业务主键, 只使用逻辑主键
  • 实体一般拥有业务唯一标识 no
  • 创建时间 create_time
  • 更新时间 update_time

数据类型

字符串类型

  • 定长字符串: char(n)
  • 不定长字符串: varchar(n)
  • 长文本 text

整数类型

无符号 unsigned

类型 范围(有符号) 范围(无符号)
tinyint (-128,127) (0,255)
smallint (-32 768,32 767) (0,65 535)
mediumint (-8 388 608,8 388 607) (0,16 777 215)
int (-2 147 483 648,2 147 483 647) (0,4 294 967 295)
bigint (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615)

小数类型

decimal(m, d)

布尔类型

boolean

boolean 其实是 tinyint(1)

日期类型

datetime(3)

使用 datetime(3) 来精确到毫秒

约束

非空约束

字符串类型必须加非空约束, 若可空, 请加默认约束, 并默认值为空字符串
布尔类型 / 数字类型 / 日期类型尽量使用非空约束

默认约束

尽量少用

外键约束

不使用, 由应用层保证

check 约束

不使用, 由应用层保证

唯一约束

可使用

命名规则

采用下划线命名法, 英文字母全小写

字段命名

逻辑主键约定为 id
业务唯一标识约定为 no
创建时间约定为 create_time
更新时间约定为 update_time

外键约定为 {table_name}_id
引用数据字典约定为 {数据字典类型编码}_key

索引命名

  • 主键: pk_{column1}{column2}
  • 唯一索引: uk_{column1}{column2}

文档

表注释

{表中文名称}, {说明}

字段

主键

主键

业务唯一标识

业务唯一标识, {说明}

外键

外键, {table_name}.id

数据字典

数据字典, 类型编码: {xx}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!