Handsomefan 2015-04-21
数据库设计
1.就是设计E-R
2.然后根据转化原则转化成某一模式的数据(关系模式数据)
3.再用范式分析调整关系模式数据使之符合范式(数据存储才高效可用)
1.关系模型:用二维表格结构表示实体集,外键表示实体间联系的数据模型称为关系模型。关系模型是由若干个关系模式组成的集合。
2.关系模式:关系模式实际上就是记录类型。它包括:模式名,属性名,值域名以及模式的主键。关系模式仅是对数据特性的描述。
3.关系实例:就是一个关系,即一张二维表格。
4.属性:在关系模型中,字段称为属性。
5.域:在关系中,每一个属性都有一个取值范围,称为属性的值域。
6.元组:在关系中,记录称为元组。
7.候选码:在关系中能唯一标识元组的最小属性集称为关系模式的候选码。
7.主属性:存在于候选码(一个候选码可能是多个属性)中的某一属性。
8.主码:用户选作元组标识的一个候选码为主码。
9.外码:某个关系的主码相应的属性在另一关系中出现,此时该主码在就是另一关系的外码,如有两个关系S和SC,其中S#是关系S的主码,相应的属性S#在关系SC中也出现,此时S#就是关系SC的外码。
表之间关系只有父表子表关系:父表子表是指,表A的主建在表B中出现,A是附表B是子表
1NF:属性没有再分(例如人有电话号码的属性,里面存了一个串,用的时候要求前半部是家庭号码,后半部是公司号码,。就不符合1NF)
2NF:非主属性直接完全依赖或间接完全依赖候选键。(不可部分依赖候选键)(不符合就会数据冗余,更新异常,插入异常,删除异常)
3NF:非主属性直接完全依赖候选键。(不符合就会数据冗余,更新异常,插入异常,删除异常)
BCNF:非主属性直接完全依赖候选键,主属性对不包含它的键是直接完全函数依赖。
难点:根据约束条件找关系,(一个条件,或多个条件能唯一确定谁),然后确定候选键和主键
E-R图转换成关系模式数据(数据库表)
1 E-R模型向关系模型的转换规则:
从数据需求分析中分析出系统的实体属性图,需要遵循三范式原则,对实体之间的依赖关系进行了整合,得出系统E-R图。
说明:菱形表示实体之间的关系,用矩形表示实体,用无向直线把菱形与有关实体连接,在直线上标明联系的类型。用椭圆表示实体的属性,并用无向直线把实体与属性联系起来。
(1)实体类型的转换
将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键。
(2)联系类型的转换
1)实体间的联系是1:1
可以在两个实体类型转换成两个关系模式中的任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。
2)如实体间的联系是1:N
则在N端实体类型转换成的关系模式中加入1端实体类型转换成的关系模式的键和联系类型的属性。
3)如实体间的联系是M:N
则将联系类型也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。
2 三元联系转换
1:1:1可以在三个实体类型转换成的三个关系模式中任意一个关系模式的属性中加入另两个关系模式的键(作为外键)和联系类型的属性
1:1:N在N端实体类型转换成的关系模式中加入两个1端实体类型的键(作为外键)和联系类型的属性
1:M:N将联系类型也转换成关系模式,其属性为M端和N端实体类型的键(作为外键)加上联系类型的属性,而键为M端和N端实体键的组合
M:N:P将联系类型也转换成关系模式,其属性为三端实体类型的键(作为外键)加上联系类型的属性,而键为三端实体键的组合
上图E-R模型向关系模型的结果:
仓库(仓库号#,仓库名,地址)
商店(商店号#,商店名)
商品(商品号#,商品名)
进货(商店号#,商品号#,仓库号#,日期#,数量)
关系模式的范式
主要有4种范式,1NF,2NF,3NF,BCNF,按从左至右的顺序一种比一种要求更严格。要符合某一种范式必须也满足它前边的所有范式。一般项目的数据库设计达到3NF就可以了,而且可根据具体情况适当增加冗余,不必教条地遵守所谓规范。
简单而言,1NF就是要求一张表里只放相互关联的字段,一个字段里只放一条信息,这只是最基本的要求。至于2NF,3NF,BCNF虽然描述的内容不同,但表现在数据特点上很相似,就好比在说不要为了向某厂订购一批货记下来,就把的厂的面积、电话等都放在同一张表里,而应该用两张表,以尽量避免浪费数据存储空间。因为和同一个厂可能会交易好几次,但没必要每次交易都记录全部的信息。
从范式所允许的函数依赖方面进行比较。
以下对每种范式作一一说明。
2.3.4.2 第一范式
在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法:
一是重复存储职工号和姓名。这样,关键字只能是电话号码。
二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性
三是职工号为关键字,但强制每条记录只能有一个电话号码。
以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。
2.3.4.3 第二范式
关系的第二范式(2NF)定义: 如果关系模式R为1NF,并且R中的每一个非主属性都完全依赖于R的某个候选关键字,则称R是第二范式的,简记为2NF。
【例2.40】 设有关系模式R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),基于R的函数依赖集F={(S#,C#)→G,C#→TN,TN→TS},判断R是否为2NF。
解:
(1) 容易看出,关系模式R是1NF。因为R符合关系的定义,R的所有属性值都是不可再分的原子值。
R是否为2NF,应根据2NF的定义来判断。
首先要确定关系模式R中各属性间的函数依赖情况。如果没有直接给出R的函数依赖集,就要按照语义把它确定下来。在本例中,已直接给出基于R的函数依赖集F,我们可使用阿氏推理规则并结合下面介绍的方法,进一步确定R中哪些是主属性、哪些是非主属性、侯选关键字由哪些属性构成。
方法① 写出函数依赖集F中的各个函数依赖以帮助分析。方法①的特点是直接。
F={(S#,C#)→G,
C#→TN,
TN→TS
}
方法② 用有向图表示属性间函数依赖,结点表示属性,方框包含若干个结点表示属性组合,有向箭头表示函数依赖。本例的函数依赖图如图2.9所示。方法②的特点是直观。
图2.9 函数依赖图例子
方法③ 把关系模式R与函数依赖集F结合起来,属性组合用下划线(或上划线)表示,函数依赖用有向箭头表示。本例的函数依赖简图如图2.10所示。方法③的特点是简单。
图2.10函数依赖简图例子
用阿氏推理规则由F可推出:(S#,C#)→{S#,C#,G,TN,TS},即属性组合(S#,C#)是R的候选关键字(R只有这一个候选键)。(S#,C#)的一个值可惟一标识R中的一个元组(并且没有多余的属性)。
在R中,S#,C#是主属性;其余的属性G,TN,TS为非主属性。
借助上面的图,我们可以看到,非主属性G对键是完全依赖:(S#,C#)→G。但非主属性TN,TS对键是部分依赖(他们仅依赖于键的真子集C#)。由于R中存在非主属性对候选键的部分依赖,所以关系模式R不是2NF。
R中存在非主属性对候选键的部分依赖,将会引起数据冗余、数据操作异常等问题。可以把关系R无损联接地分解成两个2NF的关系模式:
ρ={R1,R2},R1={S#.C#,G},R2={C#,TN,TS}。
【例2.41】选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。
由以上条件,关键字为组合关键字(SNO,CNO)
在应用中使用以上关系模式有以下问题:
a.数据冗余,假设同一门课由40个学生选修,学分就 重复40次。
b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。
c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
d.删除异常,若学生已经结业,从当前数据库删除选修记录,就会可能连课程号及学分完全从数据库中删除,则此门课程及学分记录无法保存。
原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系
2.3.4.4 第三范式
关系的第三范式(3NF)定义: 如果关系模式R为2NF,并且R中的每一个非主属性都不传递依赖于R的某个候选关键字,则称R是第三范式的,简记为3NF。
【例2.42】续上例2.40(R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS)),判断关系模式R1={S#.C#,G},R2={C#,TN,TS} 是否为3NF。
解:
(1) 在关系模式R1={S#,C#,G},候选关键字是(S#,C#),主属性是S#,C#,非主属性是G,函数依赖为(S#,C#)→G。 由于R1中不存在非主属性对候选关键字的传递依赖,所以关系模式R1是3NF。
(2) 在关系模式R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。由于R2中存在非主属性对候选关键字的传递依赖C# TS,所以关系模式R2不是3NF。
可以把关系R2无损联接地分解成两个3NF的关系模式:
ρ={R3,R4},R3={C#,TN},R4={TN,TS}。
【例2.43】如(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,
姓名,所在系,系名称,系地址。 判断关系模式S1是否为3NF。
关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,是2NF。
但这关系有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。关键字 SNO 对 LOCATION 函数决定是通过传递依赖:SNO -> DNO,及DNO -> LOCATION实现的。也就是说,SNO不直接决定非主属性LOCATION,不是3NF。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。
2.3.4.5 Boyce-Codd范式
关系的Boyce-Codd范式(BCNF)定义: 如果关系模式R为1NF,并且R中的每一个函数依赖X→Y(YÏX),必有X是R的超关键字,则称R是Boyce-Codd范式的,简记为BCNF。
从BCNF的定义中,可以明显地得出如下结论:
(1) 所有非主属性对键是完全函数依赖;
(2) 所有主属性对不包含它的键是完全函数依赖;
(3)没有属性完全函数依赖于非键的任何属性组合。
与2NF,3NF的定义不同,BCNF的定义直接建立在1NF的基础上。但实质上BCNF是3NF的改进形式。3NF仅考虑了非主属性对键的依赖情况,BCNF把主属性对键的依赖情况也包括进去。BCNF要求满足的条件比3NF所要求的更高。如果关系模式R是BCNF的,那么R必定是3NF,反之,则不一定成立。
【例2.43】 续前例2.42(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),判断两个3NF关系模式R3={C#,TN},R4={TN,TS}是否为BCNF。
解:在关系模式R3中有函数依赖C#→TN,决定因素C#是R3的键;
在关系模式R4中有函数依赖TN→TS,决定因素TN是R4的键;
R3,R4都满足BCNF的定义,所以,这两个关系模式都是BCNF。
【例2.44】配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件
a.一个仓库有多个职工。
b.一个职工仅在一个仓库工作。
c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d.同一种型号的配件可以分放在几个仓库中。
分析:由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)-> ENO。因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (ENO,PNO)-> QNT。
找一下候选关键字,因为(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此 (WNO,PNO)可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO 均为主属性,只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。
分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而P->WNO,故(ENO,PNO)-> WNO 也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。
理解:一范式 对属性原子性约束,属性是不可再分的。
二范式 主属性是两个字段的,非主属性部分依赖于主属性则不是二范式,只有非主属性完全依赖于主属性,则满足第二范式。
这其中会出现四种异常,数据冗余,更新异常,插入异常,删除异常,具体情况具体理解。
三范式:就是即满足第一范式,也满足第二范式,就像上面所说“R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。”也就是非主属性依赖了非主属性,或是候选键依赖了候选键,这就不是第三范式了。第三范式也不存在非主属性对非主属性的依赖。
BCNF:比第三范式要求更高,第三范式是要求你非主属性对非主属性的依赖情况,BCNF是把主属性对候选键的依赖情况。
机房收费系统设计关系模式时,没有考虑太多,因为根据界面看的需求本身就有局限性,机房收费系统也只是个独立的系统,不像评教系统那样,所以没考虑那么多,但在重新建表的时候也要按照建表的规则来思考,就当复习了一遍数据库原理的知识了。