如何设计好一张表呢?
1 设计的表达到什么要求?
1.1 首先能满足业务需求;
1.2 增删改查性能尽可能高;
1.3 扩展方便;
1.4 命名规范;
2 明确该表的使用场景?
对每日数据增量和数据全量进行评估;
对表的操作根据业务进行评估,是查询频繁还是修改频繁等;
3 设计注意事项
3.1 范式规范;
第一范式:对属性的原子性,要求属性具有原子性,不可再分解;
第二范式:对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;
第三方式:对字段的冗余性,要求任何字段不能由其他字段派生出来,即不存在传递依赖。
3.2 根据范式规范设计满足需求的表结构后,再根据业务场景优化;
1 冷热数据分表;
经常更新的数据字段,不经常更新的字段新建一张表;
2 数据量大垂直分割;
数据多,根据日期或业务id分表;
如果业务上只使用最近几日的数据,可以不用分表,只需要保留最近的数据;
(怎么保留近几日的数据有哪些方案呢,后面文章再讲)
3 索引设计;
索引类型的选择,唯一,普通,组合索引;
字段太长,限制索引的长度;
查询条件字段建索引,设置为非null避免索引失效;
索引数据类型的选择tree和hash;
索引相关的内容挺多的后面单独讲。
4 业务字段冗余来减少表关联;
反范式设计就是加冗余字段,改动概率比较小字段适合加冗余字段,减少关联多表查询。
5 选择合适的字段类型;
id的选择:自增主键(使用bigint);UUID;雪花算法等;
数字类型:金额单位可以转为分,使用bigint类型;
日期:使用DATETIME, 而不是TIMESTAMP(TIMESTAMP 的上限值 2038年,时区转换性能问题) 和 INT 类型;
字符串:CHAR 和 VARCHAR 虽然分别用于存储定长和变长字符,有的业务是隐私信息,如密码、手机等信息需要加密考虑长度;
json:无须预先定义列,适用不经常更新的静态数据存储,可以使用索引,mysql8.0进行了优化;
6 字段长度根据业务设置;
字段类型应该根据所需存储的数据长度来选择
如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表;
7 关联关系在业务层面约束,不要设置数据库外键;
外键约束缺点:增删改时每次检查约束的性能问题;数据库分割灵活性;约束检查时死锁死循环等;
8 每个表都需要添加通用字段,如主键,创建和更新时间,创建人等;
9 命名规范,不要用使用mysql的保留字段,字段注释写清楚,使用英文和驼峰或者下划线分割的方式让人见名知意。
总结:上面是个人开发中的总结,实际情况根据公司业务来定就行。另外对线上表的操作一定要谨慎,选择在业务低峰期进行操作,减少锁表的可能性等,有从库的话记得观察从库的同步情况防止主从同步延迟。