作者:whisper
链接:http://proprogrammar.com:443/article/574
声明:请尊重原作者的劳动,如需转载请注明出处
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
范式的种类:
各种范式之间存在联系:
某一关系模式R为第n范式,可简记为R∈nNF
一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization) 。
1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据模式。
满足第一范式的关系模式并不一定是一个好的关系模式。
[例] 关系模式 S-L-C(Sno, Cno, Sdept, Sloc, Grade) Sloc为学生住处,假设每个系的学生住在同一个楼。
1.S-L-C满足第一范式。
2 S-L-C的码为(Sno, Cno),主属性: Sno, Cno。
非主属性: Grade , Sdept和Sloc。
3.非主属性 Sdept 和 Sloc 部分函数依赖于码(Sno, Cno)。
定义6.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
例:
非主属性 Sdept 和 Sloc 部分函数依赖于码(Sno, Cno)。
一个关系模式R不属于2NF,就会产生问题。
例如S-L-C存在的问题:
(1) 插入异常
假设Sno=2014102, Sdept=IS, Sloc=N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入SLC。
(2) 删除异常
假定2014104学生只选修了3号课程这一门课。现在因身体不适,他连3号课程也不选修了。因课程号是主属性,此操作将导致该整个元组的删除。这样, 2014104学生信息都被删除了。
(3) 数据冗余度大
如果一个学生选修了8门课程,那么他的Sdept和Sloc值就要重复存储了8次。
(4) 修改复杂
例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部Sdept、 Sloc信息。
原因: SLC(Sno, Sdept, Sloc, Cno, Grade) 中Sdept、 Sloc部分函数依赖于码。 SLC的码为(Sno, Cno)
解决方法
采用投影分解法,把S-L-C分解为两个关系模式,消除这些部分函数依赖
函数依赖图:
• 关系模式SC的码为(Sno, Cno),关系模式S-L的码为Sno
• 非主属性对码都是完全函数依赖了。他们都是2NF。
• 从而使上述四个问题在一定程度上得到了一定的解决。
(1) 由于学生选修课程的情况与学生的基本情况是分开存储在两个关系中的,在S-L关系中可以插入尚未选课的学生。
(2) 删除一个学生的所有选课记录,只是SC关系中没有关于该学生的记录了, S-L关系中关于该学生的记录不受影响。
(3) 不论一个学生选多少门课程,他的Sdept和Sloc值都只存储1次。这就大大降低了数据冗余。
(4) 学生转系只需修改S-L关系中该学生元组的Sdept值和Sloc值,由于Sdept、 Sloc并未重复存储,因此减化了修改操作。
2NF还有什么问题?
2NF关系模式S-L(Sno, Sdept, Sloc)中
函数依赖:
S-L关系存在的问题:
(1) 插入异常
如果某个系因种种原因(例如刚刚成立),目前暂时没有在校学生,我们就无法把这个系的信息,如MA, S,存入数据库。
(2) 删除异常
如果某个系(如IS)的学生全部毕业了,我们在删除该系学生信息的同时,把这个系的信息,如IS, N,也丢掉了。
(3) 数据冗余度大
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现, 重复次数与该系学生人数相同。
(4) 修改复杂
学校调整学生住处时,由于关于每个系的住处信息是重复存储的,修改时必须同时更新该系所有学生的Sloc属性值。
原因:
S-L中Sloc传递函数依赖于Sno,即:非主属性传递函数依赖码
解决方法
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept, Sloc)
S-D的码为Sno, D-L的码为Sdept
异常的情况得到改善:
(1) D-L关系中可以插入系的信息, 即使还没有在校学生。
(2) 某个系的学生全部毕业了,只是删除S-D关系中的相应元组, D-L关系中关于该系的信息仍存在。
(3) 关于系的住处的信息只在D-L关系中存储一次。
(4) 当学校调整某个系的学生住处时,只需修改D-L关系中一个元组的Sloc属性值。
S-D的码为Sno, D-L的码为Sdept。
在分解后的关系模式中既没有非主属性对码的部分函数依赖,也没有非主属性对码的传递函数依赖,进一步解决了上述四个问题。
例: S-D(Sno, Sdept) ∈ 3NF
D-L(Sdept, Sloc) ∈ 3NF
S-L 不存在部分函数依赖,但是存在传递函数,所以
3NF的一些性质:
亲爱的读者:有时间可以点赞评论一下
全部评论