数据库设计:规范化设计
来源:互联网 发布:淘宝酷动城怎么加入 编辑:程序博客网 时间:2024/06/02 17:19
先看一个表:
70
80E103P2D3390
100
110E105P3D22120
24
(表1)
首先我们看到hours属性下面的都是多值,这就是一个不规范化的表。
所谓的规范化就是满足数据库关系模型设计中的1NF,2NF, 3NF, BCNF, 4NF, 5NF。
通常4NF,5NF我们是用不上的,下面我们就来了解一下前面的几个范式吧!
1NF:表中的每一个单元都是单值,符合第一范式。
从表1中我们可以清楚的看到hours属性下面的值都分别是3个,这就违反了1NF的原则!我们可以这样修改表1使其满足1NF。
2NF:表满足1NF,表中的每一行中的属性都函数依赖于整个主关键字,说明表符合2NF。
首先先介绍一下什么叫函数依赖吧!
所谓的函数依赖指的就是表中的A能够决定表中的B,且这种关系是一一对应的,就说B依赖于A即数学表达式中的A->B。
例如下表:
Ecode 都是能够唯一的决定一个dept即E101->SYSTEMS, E305->FINANCE, E508->ADMIN
而对于Pcode的 E101对应于P27,P51,P20,非一一对应的关系
所以我们可以说dept函数依赖于Ecode,其中Ecode是决定因子!
那我们现在就可以开始来判断该Project表是否符合2NF, 首先我们可以简单的看出,其符合1NF,
然后由表中我们可以得出(Ecode,Pcode)是该表的复合主关键字,于是我们就要判断dept,hours是否函数依赖于此关键字。
从表中E101->90,101,60, P27>90, 10, 72可以知道hours并不函数依赖于Ecode或Pcode,然而,对应每个(Ecode,Pcode)都有一个唯一对应的hours,
说明hours函数于整个关键字。
从表中我们可以简单的看出dept肯定函数依赖于Ecode,但对于Pcode, P27->SYSTEMS,FINANCE,ADMIN,说明dept不函数依赖于Pcode
因此,dept只是部分函数依赖于主关键字(Ecode,Pcode),说明该表并不满足2NF的条件:表中的每一行中的属性都函数依赖于整个关键字。
下面就给出将该表转换为2NF的方法:
(1)找出并移去部分函数依赖于整个关键字的属性,将其和其依赖于的属性放入一个表中。
(2)将剩余的属性分组。
应用上面的方法则可以得出下面两个表:
3NF:表必须先符合2NF,表中的非关键字属性都只函数依赖于主关键字。
例如下表:
观察上表,我们可以知道该表的主关键字为Ecode, 那么该表是否符合3NF的要求呢?
根据2NF的定义,我们可以判断该表肯定符合2NF要求(每一行中的属性都函数依赖于整个关键字Ecode)
那么,我们现在运用3NF的定义来判断该表是否符合3NF的要求!
首先,非关键字属性为dept,depthead,我们知道他们必定函数依赖于Ecode(Ecode是主关键字),但是,从表中,SYSTEMS->E901,FINANCE->E909,SALES->E906,
ADMIN->E908,我们可以知道,depthead不仅函数依赖于Ecode,还函数依赖于dept,但dept并非是主关键字,因此,该表并不是3NF。
那么下面我们就运用下列方法将其转换为3NF吧!
(1)找出并移去函数依赖于非关键字属性的非关键字属性,将其与其函数依赖于的非关键字属性放入一个表中;
(2)将其余属性再分组。
运用上面的方法,我们就能得到下面的2个符合3NF的表:
(1)表中有多个候选关键字
(2)表中多个关键字都是复合的
(3)表中的候选关键字都是重合的(至少有一个属性是重合的)
例如下表:
从上表中,我们明显的发现存在冗余,如果某个员工更改了名字,需要为表中进行一致的修改,否则将引起数据的不一致性。
那我们分析下该表是否已经规范化了呢?
首先,该表没有多值属性,符合1NF,
其次,我们需要确定该表的关键字, 惊奇的发现该表的关键字(能唯一确定表中一行的属性或复合属性),并不止一个,并且他们都是复合的,分别是
(Ecode,Pcode)(Name,Pcode),这时我们称他们为候选关键字。
然后再观察该表,我们可以发现,剩余的属性hours都依赖于候选关键字(Ecode,Pcode)和(Name,Pcode),因此根据2NF,3NF的定义,我们可以判定
其符合2NF,3NF。
虽然该表符合了3NF,但是,该表确实满足了3NF所不能规范化的3个条件,所以此时,我们需要采用另一种范式来规范化此表,
那就是BCNF。
BCNF:表中的每个决定因子都只能是主关键字。
又上表中我们能得到下面的函数依赖:
hours函数依赖于(Ecode,Pcode)
hours函数依赖于(Name, Pcode)
Ecode函数依赖于Name
Name函数依赖于Ecode
我们发现唯一的非关键字属性都依赖于了整个候选关键字,但是Name,和Ecode却相互依赖,说明他们是决定因子,然而他们本身并不是候选关键字。
(对于BCNF来说,每个决定因子都必须是候选关键字)
那么我们怎么样将其转换成BCNF呢?
方法:
(1)找出并移去重合的复合的候选关键字,并将其与函数依赖于其的部分放入一个表中
(2)将剩余的分组放入另一个表中。
运用上面的方法,我们就能得到下面的表:
这样可能会带来数据的不一致和磁盘空间上的浪费,但换来的确是数据库存取数据的效率!
当应用程序需要大量频繁的访问数据库中需要连接的表,而两张表格的数据确不多的情况下,增加一定的冗余就可以换来存取上的高效率,何尝不可!
- 数据库设计:规范化设计
- 数据库设计中的规范化
- 数据库设计中的规范化
- 数据库设计的规范化
- 数据库设计之规范化
- 规范化-数据库设计原则
- 规范化-数据库设计原则 ()
- 规范化-数据库设计原则
- 规范化-数据库设计原则
- 规范化-数据库设计原则
- 数据库设计 范式 规范化实例
- 规范化-数据库设计原则
- 规范化-数据库设计原则
- 规范化-数据库设计原则
- 数据库规范化设计理论摘要
- 规范化-数据库设计原则
- 数据库设计之反规范化
- 关系数据库设计规范化流程
- NSNull Category
- Openstack Ice-House 版本说明--之一 NOVA
- 省赛组队赛5
- 计算机专业学习浅谈
- 项目最重要的环节:写文档
- 数据库设计:规范化设计
- 动态代理
- 深入浅出交换类排序算法
- Android NFC 学习笔记与总结
- adb error:错误
- 并查集
- MapReduce编程实战之“高级特性”
- 字符编码笔记:ASCII,Unicode和UTF-8
- 深入分析 Java 中的中文编码问题