判断关系所属范式时,需要先找到候选关键字:没有在FD右边出现的属性必定是候选关键字的一部分,如果找不到,则进行枚举,寻找闭包
没有非主属性,一定是第三范式
ch4.高级数据库模型
用于表达数据库的设计的方式包括:E-R图、UML、ODL
实体联系模型(E-R)
实体集
相似抽象对象的集合为实体集
属性
实体集与属性相关联,属于实体的特性
联系
两个或多个实体集之间存在联系
E-R图
E-R图用于表示实体集、属性和联系。在图中,使用矩形来表示实体,椭圆表示属性,菱形表示联系。使用边来连接实体与属性/实体和联系
E-R图示例如图1所示:
图中共有Stars、Movies和Studios三个实体,每个实体都有各自的属性,而Stars与Movies之间具有联系Stars-in,Studios与Movies之间具有联系Owns
实体间关系
多对一关系(many-one):E中的任意一个元素,可以通过R联系,与F中的最多一个元素相关联,这种情况下,R为从E到F的多对一关系
一对一关系(one-one):如果E到F和F到E都是多对一关系,则R是一对一关系
多对多关系(many-many):如果E到F和F到E都不是多对一关系,则R是多对多关系
E-R图中,箭头表示“最多一个”(多对一),例如图2表示的是一对一关系:
图3则表示了每个Star和Movie的签约只能属于一个Studio:
联系的职能
在实体集和联系的连线上进行标记,为联系的职能(roles)
例如,在图4中,Movies实体集中的实体Movie可以是另一个实体Movie的续集,也可以是另一个实体Movie的前作:
联系上的属性
有时候,属性会不在实体集上,而是在实体集间联系上,这样的属性的值函数依赖于与此联系相关联的实体集。然而,实际上,把属性连在联系上并不是必须的,可以通过新增一个实体集来避免这一点。
如图5所示,左图的联系Contracts上的“薪水”属性,可以转换为右图中的Salaries实体集,并使其带有salary属性:
将多路联系(Multiway)转换为二路联系(Binary)
连接实体集(Connecting Entity Set):实体被看做是多路联系的联系集的元组
例如对图5的E-R图进行修改得到的图6就是二路联系:
E-R模型中的子类
实体集的子类与实体集连线时,使用isa关系标记:
子类可以有自己特有的属性
设计原则
忠实性
实体集及其属性应反应出现实
避免冗余
避免在将E-R图转换成一个关系时,出现事实的重复
避免更新异常
简单性
避免在设计中加入比必要元素更多的元素,从而避免程序变得更复杂,更浪费空间以及更容易犯错
E-R模型中的约束
键
每个实体集都必须有一个键,键在E-R图中使用下划线表示,如图7:
引用完整性
用圆箭头表示一个联系是否被期望在一个或多个方向上支持引用完整性,在图8中,Movies中的每一个Movie都必须存在于Studios中,同样地,每一个President也必须存在于Studios中:
度约束
在E-R图的边上添加约束,表明限制了一个实体与其他实体相连接的数量,图9表示,一个Movie最多不能与超过10个Stars进行关联:
弱实体集
如果一个实体集的部分或全部的键由另一个实体集构成,那么这个实体集称作弱实体集
弱实体集使用双边矩形表示,而相应的支持联系则使用双边菱形表示:
支持联系:E是弱实体集,从E到其他实体集的多对一联系连接的键属性,这些多对一联系称为E的支持联系(supporting relationships),从E到达的实体集称为支持实体集(supporting entity set)
从E-R图到关系设计
直接的方法
将实体集转换为关系,其属性就是实体集的属性
用关系替换联系,其属性为与联系相关的实体集的键,以及联系本身的属性
关系的结合
如果有一个联系R,使得E和F满足多对一关系,则联系R中的F的键可以被E的键函数决定。因此,在此时,可以将E和R结合为一个关系,它包含E的所有属性,F的键,以及R的全部属性
弱实体集情形
如果在E-R图中出现了弱实体集,则弱实体集W的关系必须不仅包括W本身的属性,还要包括支持实体集的键
同时,对于所有弱实体集W出现的联系,必将自己的所有键属性作为W的键(包括其他属性集给W的键)
支持W的支持联系R,不需要转换为关系
综上所述,弱依赖集W的关系包括:
1、W的所有属性
2、W的支持联系的所有属性
3、对于每个与W有关的支持联系E的所有键属性
将子类结构转换为关系
直接E-R法
每个实体集建立一个关系。如果实体集五不是层次中的根,则为了能够区别元组表示的实体,关系E要包含根的键属性和E本身属性。并且,如果E和其他实体集有联系,就使用这些键属性识别与此联系对应的关系中的E实体。
面向对象法
枚举层次中所有可能的子树。为每一个子树构造一个可以描述该子树中实体的关系。这个关系模式含有子树中所有实体集的所有属性。
空值法
如果允许元组中有NULL (就像SQL中的空值)的话,就可以对一个实体集层次只创建一个关系。这个关系包含了层次中所有实体集的所有属性。一个实体就表现为关系中的一个元组。元组中的NULL表示该实体没定义的属性。
统一建模语言(Unified Modeling Language, UML)
UML与E-R的对应关系:
UML | E-R模型 |
---|---|
类 | 实体集 |
关联 | 二路联系 |
关联类 | 联系上的属性 |
子类 | isa |
聚集 | 多对一关系 |
组合 | 带有引用完整性的多对一关系 |
UML类(PK为主键)、关联与约束:
自关联、关联类:
子类、聚集(空心菱形)、组合(实心菱形):
弱实体集:
图中Crews是弱实体集,使用PK方框作为一个支持组合的锚。其含义是在组合另外一端的支持类的键属性是弱类键的一部分,连同弱类的任一属性被标记为“PK”
UML类图与E-R图能够一一对应,注意符号的表达
从UML转为关系时,类和关联各自转换为关系
对象定义语言(Object Definition Language, ODL)
基于文字
使用面向对象的术语,来确定数据库的结构