数据库范式

范式

  1. 第一范式 :设计数据库时,数据库的列属性不可再分,即列属性只能有一种值。如果不满足则需要将列分解,但是在构建数据库时,一定是满足第一范式

  2. 第二范式:非属性完全依赖于任何一个(候选)码,即完全依赖于主键

    • 依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,即X->Y
    • 码,可以是一个属性列,也可以是一个属性列组,对于码K,假如在K确定的情况下,该表除K之外的所有属性的值也就随之确定,那么K就是码。
    • 对于第二范式而言,所有的非主属性,必须要依赖于任何一个候选码(即不允许有的属性只依赖于候选码中主属性的某一部分属性),例如有一个主属性组(学号,课程)组成联合主键,学生姓名仅依赖学号,而和课程无关,所以这就不符合第二范式,所以如果不符合第二范式就只能将表拆分,按照主属性组来进行拆分即可。
  3. 第三范式:去除非主属性对码的传递依赖(即,不存在X->Y,Y->Z 成立。其中X为码,而Y和Z为非主属性(组))

    • 实际就是要求任何非主属性不依赖于其他非主属性,即在有主属性(主键)的情况下,
    • 其他的非主键属性不可以相互依赖,解决方法同样是对表进行拆分。将依赖的几个属性拆分出来即可。
  4. BC范式(BCNF),消除所有任何属性(主属性/非主属性)对码的部分函数依赖和传递函数依赖。即,前三个范式中主要是消除的非主属性对码的依赖,但是BCNF消除的是所有属性对码的部分/传递依赖

    • 即可能有多个主属性构成了多个码,由于只要属于码就是主属性所以可以出现某个(组)主属性依赖于某个码中的其他主属性(这两个依赖的主属性一般不属于同一个码)
  5. 范式的优缺点:

    • 范式化的表更新操作通常比反范式化更快
    • 当数据较好地范式化时,就只有很少或者没有重复地数据,所以只需要修改更少地数据。
    • 范式化地表通常更小,可以更好的放在内存里,所以执行操作会更快
    • 数据少意味着在检索数据时将更少的使用distinct或者group by语句
    • 但是范式化的表可能在查询时会导致更多的关联,从而影响到查询效率,甚至导致某些索引失效
  6. 反范式的优点是:因为所有数据都在一张表上,可以很好的避免关联。

https://blog.csdn.net/douunderstand/article/details/70159540

你可能感兴趣的:(数据库范式)