数据库设计(范式)
范式存在的意义
避免以下情况
- 数据冗余
- 各种插入(INSERT),更新(UPDATE),删除(DELETE)异常
一范式(1NF)
一范式的满足条件很简单,需要满足每列元素的不可再分性,即一列下面有多组数据的情况。
二范式(2NF)
二范式需要在一范式的基础上改进,需要满足非主属性必须完全依赖于主键,不然就另起一张表来实现。
- 举例
存在如下数据库 选课(学号,课号,学分,成绩,姓名)
该数据库乍一看没什么问题,但是现在课号和学号共同做主键,存在如下函数依赖关系
(学号,课号)–>成绩,学号–>姓名,课号–>学分。
这就出现了以下这些问题
- 数据冗余
同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。 - 更新异常
若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。 - 删除异常
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。 - 插入异常
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
解决方法当然是增加两张表。
- 选课(学号,课号,成绩)
- 学生(学号,姓名)
- 课程(课号,学分)
3NF
三范式又需要在二范式的基础上改进,即属性不依赖于其它非主属性,不然就另起一张表实现。
- 举例
存在以下表 (学号,姓名,学院,学院辅导员,学院地址)
存在以下函数依赖关系
学号->姓名,学号->学院,学院->辅导员,学院->学院地址
这就导致了相关问题的出现
- 数据冗余
对于同一学院,有多少学生表中就出现了多少次辅导员和地址,其实是一样的数据。 - 更新异常
修改某一学院的地址,必须修改所有行地址,否则会出现更新异常。 - 删除异常
如果删除一批学生,学院也会被删除,此时如果查找该学院,就会发现学院已经没有了。 - 插入异常
如果要新增学院,因为该学院还没有学生,自然没有主键,因此无法实现。
改进方法:创建学院表
- 学院(学院编号,学院名称,学院辅导员,学院地址)
- 学生(学号,姓名,学院编号)
判断是否满足3NF
对于每个函数依赖关系 X->A 都有
- X是key
- A是key的一部分
3NF的分解算法
- 【例】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D}
- 首先计算出F的最小依赖集,得到F’={A→BC,AD→E,E→D}。
- 观察U中是否有属性不在F’中的出现,如果有,则这几个属性组成一对关系R,并在原来的U中删除这些属性。而例子中U中的属性都出现在F中,则可以跳过这一步。
- 对F’中的函数依赖,把左边的相同分为一组,一组中出现的所有属性为一个关系。如F={A→B,A→C,……},左边都为A的分为一组,出项的所有属性组为一个关系R{A,B,C,……}。例题中左边都不相同,所以一个函数依赖组为一个关系得到转化为3NF的保持依赖分解R1{A,B,C},R2{A,D,E},R3{E,D}。
保持无损分解的算法
- 先将R转化3NF的保持函数依赖的分解,由算法一得出R1{A,B,C},R2{A,D,E},R3{E,D}。
- 求出F的key,得到key为AD,AE
- 将候选码单独组成关系得R4{A,D}和R5{A,E},然后与保持函数依赖后的分解取并集。得R1{A,B,C},R2{A,D,E},R3{E,D},R4{A,D},R5{A,E}。
- 观察新组成的分解模式中,是否存在包含关系,有则去掉被包含的。如R3{E,D},R4{A,D},R5{A,E}都包含于R2{A,D,E},则删去,最终得到转化3NF的既有无损连接性又保持函数依赖的分解R1{A,B,C},R2{A,D,E}。
BCNF
判断是否满足BCNF
如果关系模式R∈1NF,且所有的函数依赖X->Y,决定因素X都包含了R的一个候选键,则称R属于BC范式。
BCNF的分解
- 把满足BCNF的函数依赖划为一个表
- 把不满足BCNF的函数依赖化为另一个表
- 继续分解不满足BCNF的函数依赖的表
4NF
第四范式(4NF)满足BCNF,要求主关键字信息和非主关键字信息不能有一对多关系。
- 举例
存在以下表 学生(学号,姓名,电话号码)
出现以下数据
学号 | 姓名 | 电话号 |
---|---|---|
2212043 | 小白 | 18835008888 |
2212307 | 小然 | 15205205205 |
2212043 | 小白 | 18835007777 |
很明显上面的数据表中出现了冗余 ,而且也会有相应的异常,那么如何解决呢,
当然是只要存在一对多关系就另外开创表啦
- (学生,姓名)
- (学生,电话号)
多值函数依赖
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。
- tips 多值函数依赖不会单独出现 ,X->->Y,X->->Z
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.