您的位置:首页 > 数据库

数据库范式学习之2,3,BCNF

2016-11-16 10:55 253 查看
2NF:

若R是1NF,且每一个非主属性,完全函数依赖于码,则R属于2NF。

下面举一个不是2NF的例子。

关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)

其中Sloc为学生的住处,并且每一个系的学生住在同一个地方。S-L-C的码为

(Sno,Cno)。函数依赖有:

(Sno,Cno)->Grade是完全函数依赖。

Sno,Sdept,(Sno,Cno)->Sdept是部分函数依赖。

Sno,Sloc,(Sno,Cno)->Sloc是部分函数依赖。

因此上面的设计不是2NF。

一个关系模式不属于2NF就会出现下面的错误。

1.插入异常

如果要插入一个学生Sno,Sdept,Sloc但是这个学生没有选课,没有Cno那么就不能插入,因为Cno是码的一部分。

2.删除异常

如果一个学生就选了一门课,当他退选这门课的时候,我们就要把这个学生的信息一并删除掉。

3.修改复杂

如果学生从一个系转到另个系,并且他选了多门课程,然后他的每一条记录都要修改,就会产生修改复杂。

我们可以把上面的关系模式修改成其他的关系模式。

SC(Sno,Cno,Grade)

SL(Sno,Sdept,Sloc)

SC关系模式的码为(Sno,Cno),关系模式S-L的码为Sno,这样就使得非主属性对码都是完全函数依赖。

3NF:

若R属于3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。

在上面的SC和SL中,SC满足3NF,但是SL关系模式不属于3NF。

解决的办法是将S-L分解

SD(Sno,Sdept)

DL(Sdept,Sloc)

分解后的关系模式S-D和D-L不再存在传递依赖。

BCNF

满足BCNF的关系模式有下面三个特点。

1.所有非主属性对每一个码都是完全函数依赖。

2.所有的主属性对每一个不包含它的码,也是完全函数依赖。

3.没有任何属性完全函数依赖于非码的任何一组属性。

由于R属于BCNF,按照定义排除了任何属性对码的传递依赖。所以R属于3NF.

下面我们介绍一个属于3NF但是不属于BCNF的例子。

在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课程。每门课有若干教师,某一个学生选定一门课就对应一个固定教师。由语义可得到如下的函数依赖。

(S,J)->T;(S,T)->J;T->J用图6.6表示。

这里(S,J),(S,T)都是候选码

如果把(S,J)作为主码,它属于3NF但是它不属于BCNF,因为T不是主码但是它可以决定J。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: