MySQL数据库设计

常用字段类型长度

列类型 存储空间
TINYINT 1字节
MALLINT 2字节
MEDIUMINT 3字节
INT 4字节
BIGINT 8字节
DATE 3字节
DATETIME 8字节
TIMESTAMP 4字节
CHAR(M) M字节,1<=M<=255
VARCHAR(M) L+1字节,L<=M && 1<=M<=255

char与varchar的选择

  • 如果列中需要存储的数据长度差不多是一致的,则应该考虑使用char;否则应该考虑使用varchar。
  • 如果列中的最大长度小于50Byte,则一般也考虑使用char。(如果这个列很少使用,则基于节省空间和减少I/O的考虑,还是可以选择使用varchar)
  • 一般不宜定义大于50Byte的char类型列。

decimal与float的选

  • decimal用于存储精确数据,而float只能用于存储非精确数据。故精确数据只能选择用decimal类型
  • 由于float的存储空间开销一般比decimal要小(精确到7位小数只需要4个字节,而精确到15位小数只需要8字节,故非精确数据优先选择float类型。

时间类型的存储

  1. 使用int来存储时间字段的优缺点 优点:字段长度比datetime小 缺点:使用不方便,要进行函数转换 限制:只能存储到2038-1-19 11:14:07 即2^32

  2. 需要存储的时间粒度 年 月 日 小时 分 秒 周

如何选择主键

区分业务主键和数据库主键

业务主键用于表示业务数据,进行表与表之间的关联; 数据库主键是为了优化数据存储(Innodb会生成6个字节的隐含主键)

根据数据库的类型,考虑主键是否需要顺序递增

有些数据库是按照主键的顺序逻辑存储的

主键的字段类型所占空间要尽可能的小

对于使用聚集索引方式存储的表,每个索引后都会附加主键信息。

避免使用外键约束

  1. 降低数据导入的效率
  2. 增加维护成本
  3. 虽然不建议使用外键约束,但是关联的列上一定要建立索引

避免使用触发器

  1. 降低数据导入的效率
  2. 可能会出现意想不到的数据异常
  3. 使业务逻辑变得复杂

关于预留字段

  1. 无法准确的知道预留字段的类型
  2. 无法准确的知道预留字段中所存储的内容
  3. 后期维护预留字段所需要的成本同增加一个字段所需要的成本是相同的
  4. 严禁使用预留字段