【数据库系统原理】第四章 高级数据库模型:弱实体集、E/R 联系到关系的转化、子类结构到关系的转化

4.4 弱实体集

定义

实体集 E 的所有属性集均不能独立成键,

键中必须包含另一实体集 F 的键

则E是弱实体集。


弱实体集的来源

  1. 层次结构,但不是 isa 联系。

    (如果 isa 联系中丢弃了根的键,则其也可能成为弱实体集)

  2. 连接实体集(是弱实体集)。

    因为,连接实体集本身指代 连接关系 ,本质上不是真正意义上的实体;

    所以,连接实体集的键必须借助于相关实体集


弱实体集的要求

  • 弱实体集 E 的键包括:

    • 0个或多个自有属性(可以没有)
    • 通过 E 的支持联系(从 E 引出,到达其他实体集的多对一联系)的键

  • 设 R 是从 E 到 F 的多对一联系,则 R 是 E 的支持联系的条件是:

    • R 必须是从 E 到 F 的二元联系

    • 引用完整性,即 R 到 F 是圆箭头。

    • E 的键中所包含的 F 的属性 必须是 F 的键

      示例见“弱实体集中的符号”


  • 从弱实体集引出的多对一联系(假设从 E 到 F)不一定都是双边菱形,取决于 F 是否是其支持联系。

  • 弱实体集具有传递性:F 也可能是弱实体集,其支联系仍然可以是弱实体集。

  • 若 E 到 F 有多个不同的支持联系,则 E 中的键会包含多个 F 的键的拷贝。但其取值不一定都相同。


弱实体集的符号

  • 双边菱形:多对一关系的支持联系

  • 双边矩形:弱实体集

在这里插入图片描述


弱实体集的设计

  • 一般做法:每个实体集都尽量设计自身有实际意义的 ID 属性。

    当一个实体集的所有 有意义的属性 都不能作为 ID 时,再将其设为弱实体集。

    如果要求不能含有弱实体集,则可以为弱实体集增加一个无意义的 ID 属性作为主键。


4.5 从 E/R 图到关系设计

必要性等见书P92。

E/R 联系到关系的转化

两个基本规则 和 特殊处理
  • 两个基本规则:

    1. 把 每个实体集 转化为 具有相同属性集合的关系。

    2. 用关系替换联系:

      关系的属性就是 联系所连接的实体集的键集合联系自身的属性。(自身的属性 + 连接的实体集的键属性集)

  • 特殊处理:

    • 弱实体集(不可直接转化为关系)。
    • isa 联系 和 子类。
    • 关系的合并。

  • 具体到属性和重名问题

    设一个 E/R 联系为 R,则其转化后的关系中:

    • 属性

      • 包含联系 R 涉及的每一个实体集的键属性(或键属性集)
      • 包含联系 R 本身的属性(如果存在)
      • 如果一个实体集在联系 R 中有多个角色,则其出现的次数等于角色的次数,转换为关系时需要重命名(避免重名)
    • 重名问题

      如果 R 本身的属性 和 与其相连的实体集的键属性 有同名,需要重命名。


实体集 -> 关系

非弱实体集 -> 关系

对任意一个非弱实体集,创建一个同名且具有相同属性集的关系即可。


弱实体集 -> 关系

设弱实体集为 W。

  • 要点

    • W 转化得到的关系不仅包含自身属性,也包含相应的支持实体集的键属性

      • 支持实体集的辨认(E/R 图中):由从 W 引出的双边菱形(表示支持联系)连接。
    • 与 W 相连的联系,经过转化后得到的关系必须包含 W 的键属性 和 对 W 的键有贡献的实体集属性

    • 支持联系(即从W 指向 支持实体集 的联系)不必转换为关系。

      因为该关系可以通过 关系组合方法 得到。

      而在不考虑支持联系 R 的本身属性时,组合得到的关系就是 W 的关系。

  • 修改规则

    • W 转化为关系后的模式组成为:

      • W 的所有属性

      • 与 W 相连的支持联系的所有属性

      • 对于每一个连接 W 的支持联系(从 W 到实体集 E 的多对一联系),要包含 E 全部的键属性

        根据前面的要点:W 转化得到的关系不仅包含自身属性,也包含相应的支持实体集的键属性

    • 注意:不要为 与 W 相连的支持联系 构造关系


  • 带有子集模式的关系

    即使当 R 的属性集是 S 的属性集的子集,也不一定能消除 R:

    • S 的附加属性不允许把 R 的一个元组扩张到 S 中。

      书上的例子:税收对象和普通人。

      TaxPayer(name, SSNo, amount)

      People(name, SSNo)

      People 中的一些人可能并没有收入,所以不能加入 TaxPayer 中。

    • 即使 R 和 S 具有相同的属性集,也可能不等价。

      Stars(name, addr)

      Studios(name, addr)

    • (反过来看)由弱实体集和支持联系得到的关系,由于内在的支持约束,可以保证元组间的一一对应关系,所以可以消除。


关系组合

提出背景:有时,从实体集和联系转化而来的关系不一定最优。

设有关系 E 和 R,

  • E 和 R 合并的基础:

    如果存在 E 到 F 的多对一联系 R,则按照转化规则,直接转化后得到的 关系模式 E(由实体集转化,显然 E 中必然包含自己的键属性)和 R(由联系转化)都含有实体集 E 的键属性。

  • E 和 R 合并时分别保留的内容:

    关系模式 E 中还包含实体集 E 的非键属性,

    关系模式 R 中包含 F 的键属性和联系 R 中的所有属性。

  • 由于 R 是从 E 到 F 的多对一联系,所以根据 E 的键就可以确定以上属性,两个关系合并时不会产生冗余。

  • E 和 R 的组合

    设 R 是 E 到 F 上的多对一关系。

    则:

    • 组合后的模式包括:

      • E 的所有属性
      • F 的键属性
      • R 的所有属性
    • 根据多对一关系的定义,E 中的实体 e 可能找不到与其相连的 F 的实体,此时用空值

      如图所示,
      在这里插入图片描述

    • 注意:如果联系是多对多的,则不能直接组合。可能会产生冗余

      例:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述


4.6 子类结构到关系的转化

三种转化策略

  • E/R 方式转化:每个实体集对应一个关系;
  • 面向对象方法:每个包含根的实体集子树对应一个关系;
  • 空值法:创建一个包含层次中所有实体集的属性的关系,每个实体由一个元组表示,对于实体没有的属性则该元组的相应分量为空。
1. E/R 方式转化
  • 方式:给每一个实体建立一个关系。

    每个实体集对应的关系都包含根的属性集实体集本身的属性

  • 注意:isa 联系与其他不同(isa 连接的是单个实体的分量,而不是不同的实体),不能为 isa 创建关系。


  • 示例:

    在这里插入图片描述

    上图转化为

    Movies(title, year, length, genre)

    MurderMysteries(title, year, weapon)

    Cartoons(title, year)

    联系 Voices 转换为

    Voices(title, year, starName)

    starName 是 Stars 的键属性。


2. 面向对象方法
  • 方法:枚举所有包含根的子树,为每一个子树建立一个关系,该关系模式中包含子树中所有实体集的所有属性。


  • 示例:

    图同上,所有包含根(Movies)的子树如下:

    • Movies
    • Movies, Cartoons
    • Movies, MurderMysteries
    • Movies, Cartoons, MurderMysteries

    对应的关系模式:

    Movies(title, year, length, genre)
    MoviesC(title, year, length, genre)
    MoviesMM(title, year, length, genre, weapon)
    MoviesCMM(title, year, length, genre, weapon)
    ---
    还有Voives(title, year, starName)
    
    • 上例中,Voices 的处理:
      • 若 Voice 是从 Cartoons 引出的多对一联系,则可以在 MoviesC 和 MoviesCMM 中增加一个 voice 属性。
      • 若其是多对多联系,则转化为关系。

3. 空值组合关系
  • 方法:

    构造一个大关系,其包括全体实体集的所有属性。

    一个实体(不论层次)对应一个元组,该实体没有的属性元组分量,置空即可。


  • 示例:

    图同上,

    Movies (title, year, length, genre, weapon)


三种转化策略的比较

  • 支持一般查询的角度:空值法

    因为所有的属性都在一个大关系中。

  • 空间占用情况:面向对象 < E/R 方式 < 空值法。


  • 对于面向对象方法,如果一个根有 n 个孩子(一共两层),则共有 2 n 2^n 2n 个实体类。

    包含0个孩子的实体类:1 (即 root)

    包含1个孩子的实体类:n (root + child1 || … || child n)

    包含 n 个孩子的实体类:1

    Num = C n 0 + C n 1 + ⋯ + C n n = 2 n \text{Num} = C_n^0+ C_n^1 + \dots + C_n^n = 2^n Num=Cn0+Cn1++Cnn=2n


特殊查询方式下的比较
  • 仅涉及一个实体集内容的查询:E/R 法最优(每个实体集都有自己的关系)
  • 仅涉及根节点,面向对象方法最差(根节点元组被分散)
  • 涉及某一类子树,则面向对象最优(每一类都有子树对应)
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值