数据库表设计

这是一篇关于 数据库表设计 的文章。

数据库表设计

  1. 字段必须包含id字段,作为主键;create_time字段,作为创建时间,仅需要在创建记录时插入;update_time字段,作为更新时间,每次对记录进行更新时都需要更新此字段。

  2. 每个字段都需要有注释,特别是枚举字段。这个太重要了,看别人设计的表字段看的折磨。

  3. 字段命名不要中文拼音,也不要英文缩写,应该用完整英文单词,除 TCP 这种人尽皆知的专有名词缩写。

  4. 尽量选择占用小的数据类型,如果是整数,从 tinyint, smallint, int, bigint 从左往右选择。

  5. 如果是小数,比如金额之类的,尽量使用 decimal 类型。禁止使用 floatdouble,因为它们存在精度损失。

  6. 存储短文本且所有字符长度都差不多,比如账号、手机号这种,可以使用 char 类型。

  7. varchar 是可变长字符串,适用于长度不超过 5000 且字符长度参差的情况,但是字段长度一般设置为2的幂(比如字符有5-20,那么设置为vachar(32))。

  8. 如果字段真的很长,可以使用 text 类型。如果长的非常夸张,我们可以考虑分表(一个text类型的内容和一个int类型作为主键),用主键关联。

  9. 主键不能是任何业务相关的字段,必须是毫无意义且独立不重复的数字,如UUID(Universally Unique Identifier),或雪花算法生成的主键。

  10. 使用逻辑删除而不是直接在数据库中删除记录。也就是说,我们给有删除需求的每个元组添加一个unsigned tinyint类型的is_deleted字段,默认值为0,表示记录未删除,1表示记录已删除。

为什么不推荐物理删除? 一个是数据恢复困难,一旦删了库里面就真没了;再就是自增主键不连续

  1. 字段一般都定义为NOT NULL,防止出现空值。

  2. 如果数据表量过大可以建立索引,但是不宜过多(如5个)。

  3. 时间字段应使用datetime类型,而不是timestamp类型。后者有范围限制,4字节,有时区限制。

  4. 敏感信息字段,比如密码、身份证号、手机号,应使用加密存储,比如MD5SHA256等。

  5. 表名字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字,而且不能使用数据库保留字。

  6. 对于时间类字段在Java项目中的处理,须用 InstantLocalDateTimeDateTimeFormatter 来替代传统的 DateCalendarSimpleDateFormat