【数据库系统原理】第四章 高级数据库模型:统一建模语言UML、对象定义语言ODL

4.7&4.8 统一建模语言 UML

Unified Modeling Language

UML 和 E/R 图的对应关系

UMLE/R 模型
实体集
关联二元联系
关联类联系的属性
子类isa层次
聚集多对一联系
组合具有引用完整性的多对一

UML 类 及其 键

  • UML 类和 E/R 模型中的实体集类似。

  • 一个类框分为三部分:

    1. 顶部:类名
    2. 中间:属性
    3. 底部:方法
  • 指定主键:在每个键属性之后加上关键字 PK

  • 例:

    image-20220424104212985

关联

  • 定义:

    类之间的二元联系称为关联。

    (UML 中没有多路联系,一个多路联系用多个二元联系表示)

  • 关联的表示

    在两个 UML 类之间划一条线,线的下方标注关联的名字。

  • 对象数目的约束

    关联类中连接对象的数量有一定的约束,该约束通过在连接线的末端用一个 m..n 标签表示,表示至少 m 个、至多 n 个对象与另外一端的对象连接。

    • m..* 表示无上限
    • 0..* 表示对象的数目没有任何约束
    • 如果没有任何标签,则相当于 1..1 ,表示有且只有一个。
  • 例:

    image-20220424105152739

  • 引用完整性的表示

    见书P102


自关联

  • 定义:

    一个关联的两端可以连接同一个类,这样的关联称为自关联(self-association)。


  • 为区分一个类在自关联中表现的不同角色,分别给关联的两端一个名字。

  • 示例:

    image-20220424105655767

关联类

  • 关联类对应 E/R 模型中,联系的属性

  • 关联类的表示

    放在关联的中间,有自己的名字,其属性是它依附的关联的属性。

  • 例:

    image-20220424105907209

子类

  • 子类的键来自于根层次。

  • 子类中,只记录父类中没有的【额外的属性】。


  • UML 允许一个类有 4 中不同的子类:

    • 完整对局部

      每个类C的对象是否是该子类的一个成员?

      是,子类是完整的;

      否则不完整。

    • 分离对重叠

      一个对象能够出现在两个子类中,子类是重叠的;

      一个对象不能在两个子类中,子类是分离的。


  • 面向对象系统和 E/R 模型中子类的种类限制

    特性面向对象系统E/R 模型
    完整或局部?都允许都允许
    分离或重叠?分离允许重叠

  • 子类的表示

    用一个空三角箭头指向父类。

    • 例:

      image-20220424110915997

聚集和组合

  • 聚集

    • 定义:表示类与菱形端类的多对一联系;

    • 表示:

      两个类之间的一条线,末端为一个空的菱形,表示标注为 0..1


  • 组合

    • 定义:表示具有引用完整性的多对一联系;

    • 表示:两个类之间的连线,末端为一个实心的黑色菱形,表示标注为 1..1 >


  • 示例:

    image-20220424111225467

UML 图到关系的转化

类 -> 关系

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


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

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

  • 例:

    image-20220424112614540

    Movies (title, year, length, genre)

    Stars (name, address)

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


UML 子类 -> 关系
  • 三种方法:

    • E/R模式方法(每个子类的关系仅有键属性和该子类属性)

    • 面向对象方法(每个实体在一个子类的关系中)

    • 空值法(所有子类用一个关系表示)


  • 三种方法的选择:

    • 如果每一层都是分离的,用面向对象

      且不需要考虑每个可能的子树,因为每个对象仅仅属于一个类和它的祖先。

    • 如果每一层既是完整又是分离的。则用面向对象只需为叶子节点构建关系;

    • 如果层次很大并且在某些或者所有的层上是重叠的,则使用 E/R 方法


聚集 / 组合 -> 关系
  • 聚集和组合表示的是多对一关联,不为他们构建任何关系

  • 处理:

    菱形端处的类的键属性 加入到 非菱形端的类 中。

    对于聚集,这些属性可以为空

    对于组合,这些属性不能为空


  • 例:

    image-20220424113239753

    转化为如下的关系模式:

    Studios (name, address)
    Movies (title, year, length, genre, studioName)
    MoviesExecs (cert#, name, address, networth)
    Presidents (cert#, studioName)


弱类和支持组合 -> 关系
  • 支持组合的标注:

    使用一个带有字母“PK”的弱类框作为一个支持组合的锚,其含义是在组合另外一端的支持类的键属性是弱类键的一部分。

    • 例:

      image-20220424113430909

  • 将上例转化为关系模式:

    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 类名::属性名;
    
  • 例:

    image-20220424131046263

联系的多重性

ODL 中,一对互为反向的联系可分为多对一、一对一和多对多。

  • 不同类型对应的两个联系声明中分别使用“Set<>”(多)和“类型名”(一)的不同组合;
  • “多”可以是“零”,表示“任一个子集(包括空集)均可”

设有两个类 C, D,

C, D之间的联系C 中相应联系的类型D中
多对多Set<D>Set<C>
C 到 D 是多对一DSet<C>
D 到 C 是多对一Set<D>C
一对一DC

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 个类型为 T i T_i Ti,域名为 F i F_i Fi


  • 联系类型

    • 可以是一个类,或者应用于类的集合、包或列表类型构建器;

    • 注意:

      联系类型不能包含有结构类型、原子类型。且不能嵌套。

      以下三种为对应的错误示例

      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 值)。

    例:

    image-20220424133422727

    MovieExecs (cert#, name, address, networth)

  • 类中的非原子属性:

    • 结构类型

      为结构的每个字段定义一个关系的属性即可,如果命名冲突则重命名。

      例:
      image-20220424133729968

    • 集合类型

      对于属性 A 的值集合,为集合中的每个值都构造一个元组,该元组中包括属性A和类中的所有其他属性的相应值。

      但可能会产生不规范的关系(一般违反BCNF),此时用分解方法消除异常。

    • 其他类型

      • 包:增加count属性记录包中每个元组出现的次数。

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

        image-20220424134009137
      • 定长数组

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

        image-20220424134030599

ODL 联系 -> 关系
  • 在ODL中,关系互为相反地成对出现;

    对于每对联系,只需建立一个关系即可。

  • 注意:

    • 对“多对一”联系,将该联系与联系中“多”的那一方的类建立一个关系(即两个拥有共同键的关系进行关系组合),不会破坏BCNF条件。
    • 多对一联系不能组合“一”方, 会违反BCNF条件。
    • 多对多联系不可组合
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值