JAVA单排日记-2020/2/9-MySQL-三大范式
第一范式(1NF):每一列都是不可分割的基本数据项。简而言之,第一范式就是无重复的列。
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式(3NF):在2NF基础上,任何非主性不依赖于其它非主性(在2NF基础上消除传递依赖,即属性不依赖于其它非主属性)
- 概念:
-
函数依赖
:A→B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称属性B依赖于属性A。
如:学号→姓名,通过学号可以确定唯一的姓名,则称属性姓名依赖于属性学号。
(学号,课程名称)→分数,通过学号和课程名称可以确定唯一的分数,,则称分数依赖于属性组(学号,课程名称)。
-
完全函数依赖
:(A,C)→B,B属性值的确定要依赖于属性组的所有属性值A&&C
如:(学号,课程名称)→分数,通过学号和课程名称可以确定唯一的分数,单单通过学号,或者单单通过课程名称都不能确定一个分数,只有通过属性组的所有属性值学号和课程名称才能确定唯一的分数。
-
部分函数依赖
:(A,C)→B,B属性值的确定要依赖于属性组的部分属性值
如:(学号,成绩)→姓名,通过属性组中的学号就能确定唯一的姓名
-
传递函数依赖
:A→B,B→C,则称C传递函数依赖于A
如:学号→系名→系主任,系主任传递依赖于学号
- 码:如果在一张表中,某个属性/属性组,被其他所有属性所完全依赖,则称这个属性/属性组为该表的码。
如:上表中的码为(学号,课程名称)
- 主属性:码属性组中的所有属性
- 非主属性:表中其他属性
实例
第一范式:无重复的列
第二范式(2NF):在1NF基础上消除非主属性对主码的部分函数依赖
该表的码为(学号,课程名称),其中姓名、系名、系主任只依赖于属性组的学号,所以是部分函数依赖。2NF要求,在1NF基础上消除非主属性对主码的部分函数依赖
第二范式(3NF):在2NF基础上消除传递依赖,属性不依赖于其它非主属性
可以发现,系名→系主任,系主任依赖于系名,系名为非主属性