数据库表设计
-
字段必须包含
id
字段,作为主键;create_time
字段,作为创建时间,仅需要在创建记录时插入;update_time
字段,作为更新时间,每次对记录进行更新时都需要更新此字段。 -
每个字段都需要有注释,特别是枚举字段。这个太重要了,看别人设计的表字段看的折磨。
-
字段命名不要中文拼音,也不要英文缩写,应该用完整的英文单词,除 TCP 这种人尽皆知的专有名词缩写。
-
尽量选择占用小的数据类型,如果是整数,从 tinyint, smallint, int, bigint 从左往右选择。
-
如果是小数,比如金额之类的,尽量使用 decimal 类型。禁止使用 float 和 double,因为它们存在精度损失。
-
存储短文本且所有字符长度都差不多,比如账号、手机号这种,可以使用 char 类型。
-
varchar 是可变长字符串,适用于长度不超过 5000 且字符长度参差的情况,但是字段长度一般设置为2的幂(比如字符有5-20,那么设置为
vachar(32)
)。 -
如果字段真的很长,可以使用 text 类型。如果长的非常夸张,我们可以考虑分表(一个text类型的内容和一个int类型作为主键),用主键关联。
-
主键不能是任何业务相关的字段,必须是毫无意义且独立不重复的数字,如UUID(Universally Unique Identifier),或雪花算法生成的主键。
-
使用逻辑删除而不是直接在数据库中删除记录。也就是说,我们给有删除需求的每个元组添加一个
unsigned tinyint
类型的is_deleted
字段,默认值为0,表示记录未删除,1表示记录已删除。
为什么不推荐物理删除? 一个是数据恢复困难,一旦删了库里面就真没了;再就是自增主键不连续
-
字段一般都定义为NOT NULL,防止出现空值。
-
如果数据表量过大可以建立索引,但是不宜过多(如5个)。
-
时间字段应使用datetime类型,而不是timestamp类型。后者有范围限制,4字节,有时区限制。
-
敏感信息字段,比如密码、身份证号、手机号,应使用加密存储,比如MD5、SHA256等。
-
表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字,而且不能使用数据库保留字。
-
对于时间类字段在Java项目中的处理,须用
Instant
,LocalDateTime
,DateTimeFormatter
来替代传统的Date
,Calendar
,SimpleDateFormat
。