推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
一、范式化
1、范式
Normal Form = NF = 范式
指的是一张数据表的表结构所符合的某种设计标准的级别。
2、三范式
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识
第三范式:3NF是对字段的冗余性约束,要求字段没有冗余,任何字段不能由其他字段派生出来(每个属性都跟主键有直接关系而不是间接关系)
3、优点
可以尽量得减少数据冗余,使得更新快,体积小
4、缺点
对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化
二、反范式化
1、反范式化
反范式化就是违反范式化设计,使用空间来换取时间。
- 为了性能和读取效率而适当的违反对数据库设计范式的要求
- 为了查询的性能,允许存在部分(少量)冗余数据
2、优点
可以减少表的关联,可以更好得进行索引优化
3、缺点
数据冗余以及数据异常,数据得修改需要更多的成本
4、常见的反范式设计
缓存:存储从其他表获取数据的表
汇总:存储聚合数据的表
Q:如何维护缓存表和汇总表中的数据?
A:常用的有两种方式,具体使用哪种取决于应用程序:
1、实时维护数据
2、定期重建
一般来说,缓存表用实时维护数据更多点,往往在一个事务中同时更新数据本表和缓存表,汇总表则用定期重建更多,使用定时任务对汇总表进行更新。
三、范式化 VS 反范式化
不同点 | 范式化 | 反范式化 |
---|---|---|
内存占用 | 小 | 大 |
更新操作 | 快 | 慢 |
数据重复度 | 低 | 高 |
查询表关联 | 多 | 少 |
查询索引命中率 | 低 | 多 |
总结
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。