先要声明。如果你的的表已经符合BCNF了就已经完全满足规范了
什么是”范式(NF)”
按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。
1. 第一范式(1NF):
关系中的每个属性都不可再分,也就是表项不能够再分
2. 第二范式(2NF)
消除非主属性对于码的部分函数依赖。
码
其中码可以理解为主属性类似于主键。但是这里的主属性也就是码一般是由2个属性组合起来的,
函数依赖
其中函数依赖分为完全函数依赖和部分函数依赖
完全函数依赖
如
学号 F→ 姓名,(学号,课名) F→ 分数
姓名只能由学号决定。
分数只能由学号和课名共同决定,不能由他们单独决定。这就叫完全函数依赖
部分函数依赖
如
学号,课名) → 姓名,有 学号 → 姓名,存在非主属性 姓名 对码(学号,课名)的部分函数依赖
(学号,课名) → 系名,有 学号 → 系名,存在非主属性 系名 对码(学号,课名)的部分函数依赖
也就是说,系名可以由主属性之一学号确定,系名也可以由共同为主属性的学号和课号确定,这就是部分函数依赖,而第二范式就是要消除部分函数依赖
总之要想不存在部分函数依赖有两种方式,第一主属性也就是码只有一个时,那就一定不存在部分函数依赖。第二当有两个字段组成主属性时候,它的非主属性必须只能考两个字段才能唯一确认。
3. 第三范式(3NF)
消除了非主属性对于码的传递函数依赖
如果:主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖
所以要消灭传递函数依赖就要把系名和系出任拆分出来构成新表
BCNF范式
存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。
解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖