文章目录

  • 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 模型中的实体集类似。
  • 一个类框分为三部分:
  1. 顶部:类名
  2. 中间:属性
  3. 底部:方法
  • 指定主键:在每个键属性之后加上关键字 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 图到关系的转化

类 -> 关系

为每个类创建一个关系,关系名为类名,关系的属性为类的属性。


关联 -> 关系
  • 总结:两个连接类的键属性 + 关联类(如果有的话) 的属性

  • 为每个关联创建一个名字为关联名的关系,关系的属性是两个连接类的键属性;
  • 如果有关联类附在联系上,则关系的属性中应包括关联类的属性。

  • 例:

iotdb数据库疑问_子类

Movies (title, year, length, genre)

Stars (name, address)

Stars-in (movieTitle, movieYear, starName, salary, residuals)


UML 子类 -> 关系
  • 三种方法:
  • E/R模式方法(每个子类的关系仅有键属性和该子类属性)
  • 面向对象方法(每个实体在一个子类的关系中)
  • 空值法(所有子类用一个关系表示)
  • 三种方法的选择:
  • 如果每一层都是分离的,用面向对象
    且不需要考虑每个可能的子树,因为每个对象仅仅属于一个类和它的祖先。
  • 如果每一层既是完整又是分离的。则用面向对象只需为叶子节点构建关系;
  • 如果层次很大并且在某些或者所有的层上是重叠的,则使用 E/R 方法

聚集 / 组合 -> 关系
  • 聚集和组合表示的是多对一关联,不为他们构建任何关系
  • 处理:
    菱形端处的类的键属性 加入到 非菱形端的类 中。
    对于聚集,这些属性可以为空
    对于组合,这些属性不能为空

  • 例:

iotdb数据库疑问_iotdb数据库疑问_02

转化为如下的关系模式:

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中

多对多

Set<D>

Set<C>

C 到 D 是多对一

D

Set<C>

D 到 C 是多对一

Set<D>

C

一对一

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 个类型为 iotdb数据库疑问_UML_03,域名为iotdb数据库疑问_iotdb数据库疑问_04
  • 联系类型
  • 可以是一个类,或者应用于类的集合、包或列表类型构建器;
  • 注意:
    联系类型不能包含有结构类型、原子类型。且不能嵌套。
    以下三种为对应的错误示例
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 值)。

例:

iotdb数据库疑问_子类_05

MovieExecs (cert#, name, address, networth)

  • 类中的非原子属性:
  • 结构类型
    为结构的每个字段定义一个关系的属性即可,如果命名冲突则重命名。
例:

iotdb数据库疑问_UML_06

  • 集合类型
    对于属性 A 的值集合,为集合中的每个值都构造一个元组,该元组中包括属性A和类中的所有其他属性的相应值。
    但可能会产生不规范的关系(一般违反BCNF),此时用分解方法消除异常。
  • 其他类型
  • 包:增加count属性记录包中每个元组出现的次数。

iotdb数据库疑问_子类_07

  • 列表:增加position属性指示对应的地址在列表中的位置。

iotdb数据库疑问_iotdb数据库疑问_08

  • 定长数组

iotdb数据库疑问_iotdb数据库疑问_09

  • 字典:表示成一个由键域和值域组成的二元组的集合。

iotdb数据库疑问_UML_10


ODL 联系 -> 关系
  • 在ODL中,关系互为相反地成对出现;
    对于每对联系,只需建立一个关系即可。
  • 注意:
  • 对“多对一”联系,将该联系与联系中“多”的那一方的类建立一个关系(即两个拥有共同键的关系进行关系组合),不会破坏BCNF条件。
  • 多对一联系不能组合“一”方, 会违反BCNF条件。
  • 多对多联系不可组合