1NF 2NF 3NF BCNF

一、关系

BCNF属于3NF,3NF属于2NF,2NF属于1NF。

 

二、定义和示例

1NF:所有的属性均为不可再分

不是1NF的例子:

有两个字段的表如下,

姓,名        年龄

张,三         20

李,四         21

其中“姓,名”字段可以分为姓和名,因此不属于1NF。

 

修改为符合1NF:

将字段“姓,名”分为两个字段,如下:

姓             名               年龄

张            三                 20

李             四                21

 

2NF:符合1NF,且所有的非候选码都完全依赖于主码

不符合2NF的例子:

学号    课程        成绩     课程代号

001    语文        80          01

002    语文        90          01

 

主属性为(学号,课程),可以看到(学号,课程)决定成绩,即成绩依赖于(学号,课程),表示为(学号,课程)->成绩,因此也有(学号,课程)->课程代号。但是存在另一个关系,课程决定课程代号,即课程->课程代号,这即所谓的非主属性“课程代号”不是完全依赖于主属性(学号,课程),而是部分依赖于主属性。也就是说尽管主属性(学号,课程)决定课程代号,但是其子集课程也可以决定成绩,即课程->课程代号。因此不属于2NF。

 

修改为符合2NF:

分成两个表,

学号    课程        成绩 

001    语文        80         

002    语文        90         

 

课程     课程代号

语文      01

令主键为学号或身份证号码即可。此时:

若学号为主键,则有学号->身份证号码,学号->成绩;

若身份证为主键,则身份证->学号,身份证->成绩;

 

3NF:符合2NF,消除肥猪行吗对码的传递函数依赖

在2NF中,仅考虑了非主属性与主属性之间的依赖关系,而没有考虑非主属性之间的依赖关系,继续以2NF中的示例为例:

学号    课程        成绩        分值

001    语文        80          B

002    语文        90          A

主属性为(学号,课程)。假设80分对应的分值为B,90分对应的分值为C,则有:

 (学号,课程)->成绩,成绩->分值。那么存在依赖传递关系,3NF就是为了消除非主属性的依赖关系所造成的依赖传递。

 

将该表分解成两个表:

学号    课程        成绩 

001    语文        80         

002    语文        90         

 

成绩     分值

80      B

90      A

 

BCNF:符合3NF,消除主属性码对码的部分和传递函数依赖

学号    成绩    分值

001    80       B

002    90       A

主属性为(学号,成绩)或(学号、分值),有(学号,成绩)->分值,有(学号,分值)->成绩,成绩->分值,成绩属于主属性,但存在传递关系。

将表分解为两个表:

 

学号    成绩 

001    80

002    90

 

成绩     分值

80      B

90      A

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