一、前言
在讲完了码的概念后,本文将讲述范式有关概念(第一、第二、第三和BC范式)
二、概念
- 范式是复合某一种级别的关系模式的集合
- 关系数据库中的关系必须满足一定要求
- 范式的种类
- 范式的联系
三、1NF
1.概述
- 一个关系模式R的所有属性都是不可分的基本数据项
- 第一范式是关系模式最起码的要求
- 不满足第一范式的数据库模式不是关系数据模式
2.例题
- S-L-C满足第一范式
- 主属性:Sno, Cno
- 非主属性:Grade ,Sdept和Sloc
- 非主属性 Sdept 和 Sloc 部分函数依赖于码(Sno, Cno)
四、2NF
1.概述
- 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则 R∈2NF
- 简洁来说,就是图中的箭头不要从框内指向框外
2.不是2NF带来的问题
1️⃣插入异常
假设Sno=2014102,Sdept=CS,Sloc=N的学生还未选课,那么该学生的信息无法插入SLC
原因:课程号是主属性
2️⃣删除异常
假定2014104学生只选修了3号课程这一门课,现在因身体不适,不选修3号课程了,要将课程号删除,但同时,由于课程号是主属性,此操作将导致该整个元组的删除。这样,2014104学生信息都被删除了
3️⃣数据冗余度大
如果一个学生选修了7门课程,那么他的Sdept和Sloc值就要重复存储了7次
4️⃣修改复杂
例如某个学生要转系。在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部Sdept、Sloc信息
3.分解为2NF的方法
4.分解后的好处
- 由于学生选修课程的情况与学生的基本情况是分开存储在两个关系中的,在S-L关系中可以插入尚未选课的学生
- 删除一个学生的所有选课记录,只是SC关系中没有关于该学生的记录了,S-L关系中关于该学生的记录不受影响
- 不论一个学生选多少门课程,他的Sdept和Sloc值都只存储1次。这就大大降低了数据冗余
- 学生转系只需修改S-L关系中该学生元组的Sdept值和Sloc值,由于 Sdept、Sloc并未重复存储,因此减化了修改操作
5.分解后残留问题
- 还不能完全消除关系模式中的各种异常情况和数据冗余
- Sloc传递函数依赖于Sno,即S-L中存在非主属性对码的传递函数依赖
- S-L关系存在插入异常、删除异常、数据冗余度大、修改复杂
五、3NF
1.概述
关系模式R<U,F> ∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Y ⊉ Z),使得X→Y,Y→Z,Y↛X,成立,则称R<U,F> ∈ 3NF
2.不是3NF带来问题
1️⃣插入异常
如果某个系因种种原因(例如刚刚成立),目前暂时没有在校学生我们就无法把这个系的信息存入数据库
原因:Sno是主码,但是主码不能为空
2️⃣删除异常
如果某个系(如CS)的学生全部毕业了,我们在删除该系学生信息的同时,把这个系的信息也丢掉了
原因:Sno是主码,把Sno删除以后,整个信息都会被删除
3️⃣数据冗余度大
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同
4️⃣修改复杂
学校调整学生住处时,由于关于每个系的住处信息是重复存储的, 修改时必须同时更新该系所有学生的Sloc属性值
3.分解为3NF的方法
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
- S-D(Sno, Sdept)
- D-L(Sdept, Sloc)
- S-D的码为Sno
- D-L的码为Sdept
4.分解后的好处
- 在分解后的关系模式中既没有非主属性对码的部分函数依赖,也没有非主属性对码的传递函数依赖,进一步解决了上述四个问题
- D-L关系中可以插入系的信息,即使还没有在校学生
- 某个系的学生全部毕业了,只是删除S-D关系中的相应元组,D-L关系中关于该系的信息仍存在
- 关于系的住处的信息只在D-L关系中存储一次
- 当学校调整某个系的学生住处时,只需修改D-L关系中一个元组的Sloc属性值。
六、结语
BC范式比较复杂,只需要知道概念即可,具体会在下一篇文章中讲述