之前总是盲目设计数据库,今天总算抽空,系统性得学习了一下数据库设计的相关准则
一、命名规范
二、选择合适的数据类型
1、尽可能选择存储空间小的字段 ,如数字类型的 tinyint<int<bigint
2、小数类型比如金额,选择Decimal
3、varchar存可变长度字符串
4、如果存储值比较大,建议字段修改为text,同时抽出一张表,用主键与之对应。
三、主键设计要合理
主键设计最好不要与业务逻辑有关联,使用无意义独立不重复的id即可。
四、选择合适的字段长度
先引入一个问题,数据库字段长度是字符长度还是字节长呢?
答:在mysql中,varchar和char是字符长度,其他类型都是字节长度。比如char(10)代表字符长度10.
在设计表的时候,需要充分考虑字段长度,建议设置为2的幂
五、优先考虑逻辑删除,而不是物理删除
物理删除:把数据从硬盘中删除。
逻辑删除:给数据添加一个标识字段,如is_deleted,表机数据是否被删除。
物理删除好处:释放内存空间
逻辑删除好处:
1、恢复数据方便。
2、物理删除会使自增主键不再连续。
3、核心业务表建议都做逻辑删除。
六、通用字段记得加
create_time 创建时间
update_time 修改时间
七、一张表字段不宜过多,尽量20个以内
八、尽可能使用not null,减少null插入数据库
优点
1、not null减少空指针问题。
2、null 占用空间,复杂运算,优化器难自动优化。
3、null可能会让索引失效。
九、评估哪些字段要索引
首先,评估数据量,如果表数据千行以内,就没必要加索引。
索引也不能加的过多,单表不要超过5个。
十、不需要严格遵守三范式,可以通过业务字段冗余减少表关联,适用于表比较大的情况。
十一、避免使用mysql保留字,降低性能
十二、尽量少使用外键、存储过程、触发器
十三、时间类型的选择
mysql推荐用date_time ,存储范围大,与时区无关。
十四、多对多关系的设计
当两张表存在多对多关系M:N时,我们应该消除这种关系,通过增加第三张表,将M:N修改为两个1:N.
比如图书和读者,一本书可以被多个读者借,一个读者又可以借多本书,可以设计借书表,包含图书表主键,读者主键,借还标记等。
参考文献:
https://www.bilibili.com/video/BV1C44y1f7Rb/?spm_id_from=333.337.search-card.all.click