文章目录
- 4.7&4.8 统一建模语言 UML
- UML 和 E/R 图的对应关系
- UML 类 及其 键
- 关联
- 自关联
- 关联类
- 子类
- 聚集和组合
- UML 图到关系的转化
- 类 -> 关系
- 关联 -> 关系
- UML 子类 -> 关系
- 聚集 / 组合 -> 关系
- 弱类和支持组合 -> 关系
- 4.9&4.10 对象定义语言 ODL
- ODL 简介
- 类声明
- 属性
- 联系
- 反向联系
- 联系的多重性
- ODL 中的数据类型
- ODL 中的子类
- ODL 中键的声明
- ODL -> 关系
- ODL 类 -> 关系
- ODL 联系 -> 关系
4.7&4.8 统一建模语言 UML
Unified Modeling Language
UML 和 E/R 图的对应关系
UML | E/R 模型 |
类 | 实体集 |
关联 | 二元联系 |
关联类 | 联系的属性 |
子类 | isa层次 |
聚集 | 多对一联系 |
组合 | 具有引用完整性的多对一 |
UML 类 及其 键
- UML 类和 E/R 模型中的实体集类似。
- 一个类框分为三部分:
- 顶部:类名
- 中间:属性
- 底部:方法
- 指定主键:在每个键属性之后加上关键字 PK
- 例:
关联
- 定义:
类之间的二元联系称为关联。
(UML 中没有多路联系,一个多路联系用多个二元联系表示) - 关联的表示:
在两个 UML 类之间划一条线,线的下方标注关联的名字。 - 对象数目的约束:
关联类中连接对象的数量有一定的约束,该约束通过在连接线的末端用一个m..n
标签表示,表示至少 m 个、至多 n 个对象与另外一端的对象连接。
-
m..*
表示无上限 -
0..*
表示对象的数目没有任何约束 - 如果没有任何标签,则相当于
1..1
,表示有且只有一个。
- 例:
- 引用完整性的表示
见书P102
自关联
- 定义:
一个关联的两端可以连接同一个类,这样的关联称为自关联(self-association)。
- 为区分一个类在自关联中表现的不同角色,分别给关联的两端一个名字。
- 示例:
关联类
- 关联类对应 E/R 模型中,联系的属性
- 关联类的表示:
放在关联的中间,有自己的名字,其属性是它依附的关联的属性。 - 例:
子类
- 子类的键来自于根层次。
- 子类中,只记录父类中没有的【额外的属性】。
- UML 允许一个类有 4 中不同的子类:
- 完整对局部:
每个类C的对象是否是该子类的一个成员?
是,子类是完整的;
否则不完整。 - 分离对重叠:
一个对象能够出现在两个子类中,子类是重叠的;
一个对象不能在两个子类中,子类是分离的。
- 面向对象系统和 E/R 模型中子类的种类限制
特性 | 面向对象系统 | E/R 模型 |
完整或局部? | 都允许 | 都允许 |
分离或重叠? | 分离 | 允许重叠 |
- 子类的表示:
用一个空三角箭头指向父类。
- 例:
聚集和组合
- 聚集
- 定义:表示类与菱形端类的多对一联系;
- 表示:
两个类之间的一条线,末端为一个空的菱形,表示标注为0..1
- 组合
- 定义:表示具有引用完整性的多对一联系;
- 表示:两个类之间的连线,末端为一个实心的黑色菱形,表示标注为
1..1
>
- 示例:
UML 图到关系的转化
类 -> 关系
为每个类创建一个关系,关系名为类名,关系的属性为类的属性。
关联 -> 关系
- 总结:两个连接类的键属性 + 关联类(如果有的话) 的属性
- 为每个关联创建一个名字为关联名的关系,关系的属性是两个连接类的键属性;
- 如果有关联类附在联系上,则关系的属性中应包括关联类的属性。
- 例:
Movies (title, year, length, genre)
Stars (name, address)
Stars-in (movieTitle, movieYear, starName, salary, residuals)
UML 子类 -> 关系
- 三种方法:
- E/R模式方法(每个子类的关系仅有键属性和该子类属性)
- 面向对象方法(每个实体在一个子类的关系中)
- 空值法(所有子类用一个关系表示)
- 三种方法的选择:
- 如果每一层都是分离的,用面向对象;
且不需要考虑每个可能的子树,因为每个对象仅仅属于一个类和它的祖先。 - 如果每一层既是完整又是分离的。则用面向对象只需为叶子节点构建关系;
- 如果层次很大并且在某些或者所有的层上是重叠的,则使用 E/R 方法。
聚集 / 组合 -> 关系
- 聚集和组合表示的是多对一关联,不为他们构建任何关系。
- 处理:
把 菱形端处的类的键属性 加入到 非菱形端的类 中。
对于聚集,这些属性可以为空;
对于组合,这些属性不能为空。
- 例:
转化为如下的关系模式:
Studios (name, address)
Movies (title, year, length, genre, studioName)
MoviesExecs (cert#, name, address, networth)
Presidents (cert#, studioName)
弱类和支持组合 -> 关系
- 支持组合的标注:
使用一个带有字母“PK”的弱类框作为一个支持组合的锚,其含义是在组合另外一端的支持类的键属性是弱类键的一部分。
- 例:
- 将上例转化为关系模式:
Studios (name, address)
Crews (number, crewChief, studioName)
4.9&4.10 对象定义语言 ODL
Object Defination Language
ODL 简介
类声明
- 关键词
class
、类名、类的特性列表。
class <name> {
<list of properties>
};
属性
- 声明:
attribute 属性类型 属性名;
- 属性可以是基本数据类型或复杂类型。
联系
- 声明:
relationship 类型 联系名;
- 联系类型:
- 多对一:类名
relationship Studio ownedBy;
- 一对多、多对多:集合类型
relationship Set<Start> stars;
反向联系
- 反向关系必须成对出现。
- 定义(在相应联系的后边):
inverse 类名::属性名;
- 例:
联系的多重性
ODL 中,一对互为反向的联系可分为多对一、一对一和多对多。
- 不同类型对应的两个联系声明中分别使用“Set<>”(多)和“类型名”(一)的不同组合;
- “多”可以是“零”,表示“任一个子集(包括空集)均可”
设有两个类 C, D,
C, D之间的联系 | C 中相应联系的类型 | D中 |
多对多 |
|
|
C 到 D 是多对一 |
|
|
D 到 C 是多对一 |
|
|
一对一 |
|
|
ODL 中的数据类型
- 基本类型
- 原子类型:整型、浮点型、字符型、字符串型、布尔型和枚举型。
- 类名:实际是一个包含类的所有属性和联系的结构。
- 结构化模型
- 集合类型
- 集合(set):
Set<T>
,无序、元素不能重复出现 - 包(bag):
Bag<T>
,无序、元素可重复出现 {1,2,1}和{2,1,1}是相同的包 - 列表(list):
List<T>
,长度可为0、有序。string即list<char>
。{1,2,1}和{2,1,1}是不同的列表。
- 数组(array):
Array<T, i>
, T为原子类型、整数i表示长度。
例:Array<char,10>
- 字典(dictionary):
Dictionary<T, S>
,表示T,S元素对的有限集合。
一个 T 对应一个 S,T 是唯一的。 - 结构(structure)类型
若T1, …, Tn是类型,F1, …, Fn分别是其域名,
则Struct N{T1 F1, …, Tn Fn}
表示一个名为N的结构类型,包含n 个域,其第 i 个类型为,域名为
。
- 联系类型
- 可以是一个类,或者应用于类的集合、包或列表类型构建器;
- 注意:
联系类型不能包含有结构类型、原子类型。且不能嵌套。
以下三种为对应的错误示例:
Struct N {Movie field1, Star field2}
Set<Integer>
Set<Array<Star,10>>
- 属性类型
- 可以是原子类型或其他复杂类型;
- 也可以多次使用类型构建器来构建;
ODL 中的子类
- 子类的属性组成:
继承父类的所有属性,和自己的属性。 - 声明:
class C extends D
多继承,用冒号将类别分开
class C extends D : E
- 例:
class CartoonMurderMystery extends Cartoon : MurderMystery {...};
ODL 中键的声明
- 声明:使用 key 或者 keys(等价)。
- 单个建:
class C(keys(attr1, attr2)) {...}
- 多个键:
class C (keys key1, key2, ...)
- 联系键
多对一联系声明为键时,表示该联系中的**“1”端可以是“多”端的键**。
- 例
见书P113 例4.54
ODL -> 关系
总体方法:
- ODL中属性为非原子类型时的处理:
- 非原子 -> 原子。
非原子类型要按照特定的处理方式转化为原子类型。 - 如果转化后产生了不规范的关系,则要按照关系模式分解的方法进行优化处理
ODL 类 -> 关系
- 类中的原子属性:
如果类中的所有特性都是属性、属性的类型都是原子类型,则直接转化。
可以创建一个属性来表达对象标识并且让它作为相应关系的键(如 id 值)。
例:
MovieExecs (cert#, name, address, networth)
- 类中的非原子属性:
- 结构类型
为结构的每个字段定义一个关系的属性即可,如果命名冲突则重命名。
例:
- 集合类型
对于属性 A 的值集合,为集合中的每个值都构造一个元组,该元组中包括属性A和类中的所有其他属性的相应值。
但可能会产生不规范的关系(一般违反BCNF),此时用分解方法消除异常。 - 其他类型
- 包:增加count属性记录包中每个元组出现的次数。
- 列表:增加position属性指示对应的地址在列表中的位置。
- 定长数组
- 字典:表示成一个由键域和值域组成的二元组的集合。
ODL 联系 -> 关系
- 在ODL中,关系互为相反地成对出现;
对于每对联系,只需建立一个关系即可。 - 注意:
- 对“多对一”联系,将该联系与联系中“多”的那一方的类建立一个关系(即两个拥有共同键的关系进行关系组合),不会破坏BCNF条件。
- 多对一联系不能组合“一”方, 会违反BCNF条件。
- 多对多联系不可组合。