范式
关系型数据库中,关于数据表设计的基本原则和规则就成为范式
三范式
第一范式:保持每列字段的原子性
第二范式:在满足第一范式的基础上,消除对主键的部分依赖,保证对主键的绝对依赖
第三范式:在满足第二范式的基础上,消除间接依赖. 不存在对主键间接依赖传递
范式优缺点
优点:
- 数据的标准化有助于消除数据库中的数据冗余
- 第三范式通常被认为 在性能,扩展性和数据完整性方面达到了最好的平衡
缺点:- 降低了查询效率,因为范式等级越高,设计出来的表就越多,进行数据查询的时候就可能需要关联多张表,不仅代价昂贵,而且可能会使得一些索引失效
- 范式只是提出设计的标准,实际设计的时候,我们可能为了性能和读取效率违反范式的原则,通过增加少量的冗余或重复的数据来提高数据库的读取性能,减少关联查询,实现空间换时间的目的
第一范式 : 每列保持原子性
原子性 : 只有一类信息 , 信息不可再拆分 ,字段代表唯一业务的语义,不会出现多维度的信息
第二范式: 属性字段完全依赖于主键—>不存在对主键部分的依赖
前提:满足第一范式
表中字段对主键产生的部分依赖 : 联合主键索引 ----- 主键的底层就是索引
表中属性字段对不全部依赖于两个主键 , 只依赖于两个主键之一的一部分
第三范式: 任何非主属性字段不依赖于其它非主属性字段–>不存在对主键间接依赖传递
前提 : 满足第二范式
消除间接依赖
违反第三范式
优化 : 按关系分成两个表
反三范式
-
一张表只做一件事—高内聚
-
适当的反三范式,以空间换时间
-
优势:
减少跨表查询带来的性能开销
减少微服务之间跨库联查,提高查询性能 -
劣势:
存储空间变大
一个表中字段做了修改,另外一个表中冗余字段也要同步进行修改,不然会导致数据不一致
频繁的增删改会消耗系统资源
数据量小不能体现优势 反而会让设计更复杂 -
对数据库的设计关注度上 需求>性能>表结构
-
适用场景: 当冗余信息能大幅度提高查询效率的时候,我们才会采用反范式的优化
增加冗余字段的建议
- 该冗余字段不需要经常修改
- 该冗余字段查询的时候不可或缺