1.实体集
实体是存在的对象,并且与其他对象可区分
实体集是一组具有相同属性的相同类型的实体
2.属性
一个实体由一组属性表示,即一个实体集的所有成员所拥有的 描述性属性(descriptive properties)
每个实体的每个属性都有一个值
当属性没有值时,属性具有空值
域 Domain – 每个属性的允许值集
属性类型:
– 简单和复合属性 Simple and composite attributes
– 单值和多值属性 Single-valued and multi-valued attributes
– 派生属性 Derived attributes
简单和复合属性
简单属性:不能分为子部分
复合属性:可以分为子部分
如果我们在某些情况下引用整个属性,而在其他情况下仅引用属性的一个组成部分,那么这是一个不错的选择
帮助将相关属性组合在一起,使建模更清晰
单值和多值属性
单值属性:对特定实体具有单个值
多值属性:具有特定实体的多个值
一个客户可能有多个电话 ➔ 特定客户实体的 phone_number 属性是多值的
派生属性
派生属性的值可以从其他相关属性或实体的值派生
例:如果客户实体集有一个属性loan_held,表示客户从银行获得了多少贷款。我们可以通过计算与该客户关联的贷款实体的数量来得出该属性的值
3.关系集
关系是几个实体之间的关联
关系集:
关系集是相同类型的一组关系
属性也可以是关系集的属性
关系集的度数 Degree
关系集所关联的实体集的数量
大多数关系集的度数都为2,即关联两个实体集
两个以上实体集之间的关系很少见。 大多数关系是二元的。
映射基数约束 Mapping Cardinality Constraints
表示通过关系集可以关联另一个实体的实体数量
- 在描述二元关系集时最有用
- 对于二元关系集,映射基数必须是以下类型之一:– 一对一– 一对多– 多对一– 多对多
参与约束 Participation Constraints
E is entity set and R is relationship set
如果 E 中的每个实体都参与了 R 中的至少一个关系 ➔ E 参与 R 是完全的(total)
如果 E 中只有一些实体参与 R 中的关系 ➔ E 参与 R 是部分的(partial)
参与度要和映射基数区分开,满参与度不一定是many,many也可能部分参与,
4. 键 Key
实体集的超键是一组一个或多个属性,其值唯一地确定每个实体。
候选键是最小的超键
尽管可能存在多个候选键,但选择其中一个候选键作为主键
实体集一定有Key,可以将所有属性作为Key
关系集的键
设 R 是涉及实体集 E1 , E2 ,…En 的关系集,关系集 R 中的关系描述为:
参与实体集的主键的组合形成关系集的超键
这意味着一对实体在特定关系集中最多可以有一个关系
在多个候选键的情况下,在选择主键时需要考虑关系集的语义
5. E-R图
矩形(Rectangles)代表实体集。
菱形(Diamonds)代表关系集。
线将属性链接到实体集,将实体集链接到关系集。
椭圆(Ellipses)表示属性,Double ellipses 双椭圆表示多值属性,Dashed ellipses虚线椭圆表示派生属性。
下划线表示主键属性
双椭圆表示多值属性,虚线椭圆表示派生属性
Roles
关系集中涉及的实体集不需要是不同的
可以使用角色来指定实体如何通过关系集进行交互
基数约束 Cardinality Constrains
我们通过在关系集和实体集之间绘制
一条有向线 (→),表示 “一个”
或一条无向线 (—),表示 “多个”
来表达基数约束
例:
一对一关系
箭头指向的就是一
一对多
一笔贷款通过borrower最多与一个客户关联,一个客户通过借款人与多笔(包括 0 笔)贷款关联
参与约束
总参与度用双线表示
每一个loan必须有一个customer,完全参与,但customer可以没有loan
基数约束的其他表示
左边的0…*表示 customer可以有0到多个borrower关系,即多个loan
有0表示customer是不完全参与的
右边的1…1表示一个loan必有一个borrower关系,即一个loan有且仅有一个customer,最少是1表示完全参与
注意:左边的0到多不是表示customer多,而是右边的loan多
三元关系
我们最多允许一个三元(或更高阶)关系中的一个箭头来指示基数约束
如果有多个箭头,有两种定义含义的方法
因为a是多,所以可以表示:
- 一个a唯一确定一个bc集
- 一个ab唯一确定一个c,一个ac唯一确定一个b
6. 设计问题
使用实体集vs使用属性
不要将一个实体集的主键用作另一个实体集的属性
显式地在实体集之间建立连接
不要将相关实体集的主键属性指定为关系集的属性(已经隐含)
使用实体集vs使用关系集
可能的指导方针是指定一个关系集来描述实体之间发生的动作
会导致重复
当几个客户可以共同持有一笔贷款时,必须为每个贷款持有人定义一个单独的关系,每个这样的关系对于loan_number和amount都有相同的值
二元关系vs非二元关系
使用二元关系可以更好地表示一些看似非二元的关系
三元关系父母,将孩子与他/她的父亲和母亲联系起来,最好用两个二元关系代替,父亲和母亲
使用两个二元关系允许部分信息(例如,只有母亲知道)
转换非二元关系到二元关系
一般来说,任何非二元关系都可以通过创建人工实体集(artificial entity set)来使用二元关系来表示
例:
将实体集 A、B 和 C 之间的 R 替换为实体集 E 和三个关系集
Drawbacks
可能必须为表示关系集的实体集创建一个识别属性
一个n-ray关系集更清楚地表明几个实体参与一个单一的关系
可能并不总是将三元关系上的约束转换为 二元关系
关系属性的放置
关系的属性也可以放到两边的实体集中,比如
如果每个帐户只能有一个客户,则可以使 access-date 成为帐户的属性,而不是关系属性
也就是说,账户与客户的关系是多对一的,或者等价的,客户与账户的关系是一对多的。
放置的规则:
- 一对多关系集的属性只能重新定位到 “多” 端的实体集
- 对于一对一的关系集,可以放在两边
- 多对多关系集,属性只能放在关系集中
注意多对多的情况
多对多只能放在关系集里
7. 弱实体集 Weak Entity Sets
有些实体集的所有属性都不足以形成主码,这样的实体集称为弱实体集。
与此相对,其属性可以形成主码的实体集称为强实体集。
通俗的说:有些实体集的所有属性都不足以形成主码,这样的实体集称为弱实体集。与此相对,其属性可以形成主码的实体集称为强实体集(strong entity)。
注意:强实体与弱实体的联系只能是1:1或1:N。弱实体参与联系时应该是“完全参与”,因此弱实体与联系间的联系也画成双线边。
依赖联系:在现实世界中,有些实体对一另一些实体有很强的依赖关系,即一个实体的存在必须以另一实体的存在为前提。前者就称为”弱实体”,如在人事管理系统中,职工家属的信息就是以职工的存在为前提的,家属实体是弱实体,子女与职工的联系是一种依赖联系。在ER图中用双线框表示弱实体。又如,学生家长是一种弱实体,因为只有学生实体存在,家长实体才会存在。用箭头表示依赖联系。
弱实体集只有在参与一对多的联系集时才有意义,这时该联系集应该不具有任何描述性属性,因为任何所需属性都可以同弱实体集相联系。强实体集和弱实体集的概念与存在依赖密切相关,强实体集的成员必然是支配实体,而弱实体集的成员是从属实体
特点:
- 不含有主键的实体集
- 弱实体集的存在依赖于识别实体集(identifying entity set)的存在
- 它必须通过从识别实体集到弱实体集的总的、一对多的关系集与识别实体集相关
- 使用双菱形描述的 识别关系 Identifying relationship
弱实体集的判别器(discriminator)(或部分键)是用来区分弱实体集的所有与识别实体集的同一实体相关的实体的属性集
弱实体集中也要有强实体集的主键作为弱实体集的属性
而弱实体集的主键由弱实体集依赖(dependent)的强实体集的主键加上弱实体集的判别器组成。
弱实体集也可以参与普通的关系连接,此时弱实体集给出的主键也同样是强实体集的主键加上弱实体集的判别器
8. 扩展 E-R 功能
扩展 E-R 功能:特殊化 Specialization
自上而下的设计过程; 我们在实体集中指定子分组,这些子分组与集中的其他实体不同。
这些子分组成为具有属性或参与不适用于高级实体集的关系的低级实体集。
由标记为 ISA 的三角形组件描述(例如,客户 “是” 人)。
属性继承(Attribute inheritance)——较低级别的实体集继承与其链接的较高级别实体集的所有属性和关系参与。
扩展的 ER 特征:泛化 Generalization
- 自下而上的设计过程——将许多共享相同特征的实体集组合成一个更高级别的实体集。
- 特殊化和泛化是彼此的简单倒置。 它们以相同的方式在 E-R 图中表示。
- 术语特殊化和泛化可以互换使用
- 可以根据不同的特征对实体集进行多种特殊化
- 每个特定员工将是 – Permanent_employee 或temporary_employee 之一的成员, – 也是官员、秘书或出纳员之一的成员
- ISA 关系也称为超类-子类关系
专业化/泛化的设计约束
- 限制哪些实体可以是给定较低级别实体集的成员。
- 条件定义 condition-defined示例:所有 65 岁以上的客户都是老年人实体集的成员; 老年人 ISA 人。
- 用户自定义 user-defined
- 限制实体是否可能属于单个泛化中的多个较低级别的实体集。
- 不相交 Disjoint一个实体只能属于一个较低级别的实体集,在 E-R 图中通过在 ISA 三角形旁边写不相交来表示
- 重叠 Overlapping一个实体可以属于多个较低级别的实体集
- 完整性约束(Completeness constraint)指定高级实体集中的实体是否必须至少属于概括内的低级实体集中之一。
- total:实体必须属于较低级别的实体集之一
- partial:实体不必属于较低级别的实体集之一
聚合 Aggregation
关系集works_on 和manages 表示重叠信息
– 每个manages 关系都对应一个works_on 关系
– 但是,有些works_on 关系可能不对应任何mans 关系,所以我们不能丢弃works_on 关系
- 通过聚合消除这种冗余– 将关系视为抽象实体– 允许关系之间的关系– 将关系抽象为新实体
- 在不引入冗余的情况下,下图表示:– 员工在特定分支机构从事特定工作– 员工 , 分公司, 职位组合可能有关联的经理
9. E-R 设计决策
- 使用属性或实体集来表示对象
- 一个现实世界的概念是由实体集还是关系集来最好地表达
- 三元关系与一对二元关系的使用
- 使用强或弱实体集
- 专业化/通用化的使用——有助于设计中的模块化
- 聚合的使用——可以将聚合实体集视为一个单独的单元,而不用关心其内部结构的细节
10. #简化为关系模式 Reduction to Relation Schemas
简化为关系模式
主键允许实体集和关系集统一表示为表示数据库内容的关系模式。
符合 E-R 图的数据库可以由模式集合表示。
对于每个实体集和关系集,都有一个唯一的模式,该模式被分配了相应实体集或关系集的名称。
每个模式都有许多列(通常对应于属性),它们具有唯一的名称。
实体集转换模式
弱实体集的模式包含一个用于识别强实体集的主键列
实体的多值属性需要新设计一个模式,包括实体的主键和多值属性的值
实体的派生属性不需要放在模式里
关系集转换模式
多对多关系集表示为具有两个参与实体集的主键属性以及关系集的任何描述性属性的模式。
模式的冗余
【多对一】和【一对多】的关系集 可以通过向“ 多 ”端添加一个额外的属性来表示,其中包含 “一” 端的主键
多方一定要完全参与,如果不完全参与,会导致null值
可以把depositor融合到account中
对于一对一的关系集,可以选择任何一方作为“多”方
——即可以在两个实体集对应的任一表中添加额外的属性
如果“多”方的参与是部分的,用与“多”方对应的模式中的额外属性替换模式可能会导致空值(If participation is partial on the “many” side, replacing a schema by an extra attribute in the schema corresponding to the “many” side could result in null values)
对应于将弱实体集与其标识的强实体集连接起来的关系集的模式是冗余的(The schema corresponding to a relationship set linking a weak entity set to its identifying strong entity set is redundant)
所以这个关系集的模式不需要定义。
Composite Attributes
直接将复合属性的值展开保存即可
Multivalued Attributes
多值属性另外建一个表,保存主表的主键和多值属性的值
11. 将特殊化表示为模式 Representing Specialization as Schemas
方法1
为上层实体形成一个模式
为每个下层实体集形成一个模式,包括上层实体集的主键和本地属性(local attributes)
(下层的属性下层存储,上层的属性上层存储)
缺点:获取有关员工的信息需要访问两个关系,一个对应于低级模式,一个对应于高级模式
(获取下层实体的属性时也要访问上层表)
方法2
(所有实体都存储完全属性,下层属性包含上层所有属性)
为具有所有本地和继承属性的每个实体集形成一个模式
如果完全特化(specialization is total),则不需要存储信息的广义实体集(person)的模式
- 可以定义为包含特化关系联合的“视图”关系
- 但外键约束可能仍需要显式模式(explicit schema)
缺点:对于既是customer又是employee的人,street和city可能会被冗余存储**(上层的属性可能会产生冗余)**
12. 聚合关系的设计
直接将所有要聚合实体的主键连接在一起就行(加上额外的属性),和正常的关系集没什么区别
| 1
| 表示方法:manages (employee_id, branch_name, title, manager_name)
|
| — | — |
如果manages可以存管理员的空值,那么works_on就是多余的
13. 银行公司:
关系集:
account_branch:
连接branch和account,因为branch是【one】,account是【many】,所以关系集的主键是account_number
最后:account_branch= (account_number, branch_name)
loan_branch:
理由同上
loan_branch= (loan_number, branch_name)
borrower & depositor :
两边都是【many】,所以主键是两边的主键的并集
borrower = (customer_id, loan_number)
depositor = (customer_id, account_number) 少了个date,,无所谓吧
cust_banker :
关系表中除了关联两个实体集的主键以外,还有新的属性,这里取了两边的主键作为关系集的主键。
cust_banker = (customer_id, employee_id, type)
弱实体集 payment:
弱实体集的主键是他所依赖的实体集的主键加上这个弱实体集的判别器(discriminator)
所以主键是loan_number+payment_number
payment = (loan_number, payment_number, payment_date, payment_amount)
loan_payment双菱形表示的关系是不需要定义的,所以这里没有这个表。
两个特殊化实体集:
这里采用的是方法一,即将上层实体的local属性保存在上层实体的模式中
savings_account = (account_number, interest_rate)
checking_account = (account_number, overdraft_amount)
设计: