数据库三大范式与反范式的概念及解决的问题
数据库三大范式与反范式 的概念及解决的问题
概念:范式是设计表结构的标准。高阶范式在低阶范式的基础上冗余度更低,一般要让表的设计尽量满足第三范式(3NF),但有时为提高某些查询性能,要破坏范式,也即反范式。
第一范式:表中的每个字段属性都是原子性的,不可分割;
(比方讲你要记录地点,那你不能设计一个字段是 省+市 的格式,应该拆开来)
第二范式:要求非主属性都要完全依赖于完整的(联合)主键;一张表只表达一个独立的意思。
(比如说记录选手战绩的 选手战绩表,他的主键是 选手id+比赛id ,其他字段有 姓名、比赛时间、得分,这其中就只有得分是完全依赖于主键的,而 姓名 和 比赛时间就没必要在这重复的记录造成冗余,到 选手表 和 比赛表 去查就是了)
第三范式:任何非主属性不依赖于主键外的字段;
(比如说记录选手信息的 选手表,他的主键当然是选手id,其他字段有 队伍id, 比赛id ,这个 比赛id 就不依赖于主键,而是依赖 队伍id 的,如果放在这不仅会造成数据冗余,你要插入一条 比赛id 原本是件很简单的事情只要在对应的队伍表那里插入就好了,现在要在每一个 参赛选手 的选手表里都插入一下,而且如果举办方如果不能知道参赛队伍有哪些选手参赛,那岂不是连插入信息都做不了了,这就是潜在的异常)
解决的问题:三大范式既减少数据冗余,也避免了一些更新数据时的异常。
反范式:为了性能和读取效率违反范式化的原则,以空间换时间的策略允许适当的冗余数据在表中;
(比如说记录选手战绩的 选手战机表,他的主键是 选手id+比赛id,其他字段就一个 得分 ,我们要是需要选手 姓名 和 比赛时间 ,就得联合其他表来查,当然会比较慢了,你要是想快那就可以违反范式化的原则,把 姓名 和 比赛时间 存在选手战绩表中)