数据库笔记(补充)——数据库设计和E——R模型

实体—联系模型

  • 实体集

    • 实体(entity):现实世界中一个可以区别于其他对象的一个“事物”或对象
    • 实体集(entity set):相同类型(即具有相同性质/属性)的实体的集合
    • 外延(extension):属于实体集的实体的实际集合

      ps: 实体集和外延的关系类似于之前讲的模式和实例的关系

    • 属性(attribute):实体集中每个成员所具有的描述性性质
    • 值(value):每个实体的每个属性都有一个
  • 联系集

    • 联系(relationship):多个实体间的相互关联

    • 联系集(relationship set): 相同类型联系的集合

    • 实体集之间的关联称之为参与:实体集E1, E2, E3 参与 联系集R
    • 联系也可以具有 描述性属性
    • 实体在联系中扮演的功能称为角色
    • 参与联系集的实体集的数目称为联系集的度, 二元联系集的度为2
  • 属性

    • 域(domain)/ 值集:每个 属性 都有一个 可取值的集合 ,称为该属性的 值集

    • 简单(simple) 和复合(composite)属性

      • 简单属性不可以再分成更小的部分,而复合属性可以(例如下面的name即为复合属性)
        1.png
    • 单值(single-value)和多值(multivalued)属性
      • 单值:一个实体在的单值属性只对应一个值
      • 多值:一个实体的多值属性可以对应多个值(如,phone_number)
    • 派生(derived)属性

      • 派生属性的值可以从别的相关属性或实体派生出来

        • eg.:银行账户的余额可以从账户的存取款明细中计算出来
      • 派生属性在原则上是不用保存的,但是有时候保存派生属性可以节约计算时间(空间换时间)

  • 约束

    • 映射基数约束

      • 一对一(one-to-one)
      • 一对多(one-to-many)
      • 多对一(many-to-one)
      • 多对多(many-to-many)
    • 参与约束

      • 全部参与:实体集E的每一个实体都参与到联系集R的至少一个联系中

      • 部分参与:实体集E中只有部分实体参与到联系集R的联系中

      • 超码
      • 候选码
      • 主码
    • 从实体集中删除冗余属性

      • 要点: 删除其他实体的主键
      • 其他实体的主键相当于外建的存在,一般属于联系集的属性
      • 举个栗子:

        • instructor(ID, name, dept_name, salary),其中ID为主键

        • department(dept_name, building, budget),其中dept_name为主键

        • 属性dept_name在两个表中都出现了,所以它属于冗余属性,他又是department的主键,故应该将其从instructor表中移除(实际数据库实现的时候instructor表中是有一个dept_name属性的,他作为一个外建存在,实际上是两者的联系集是简单的1对多的关系,便没有单独成表,而是采用外键相联系)

实体——联系图

  • 基本结构

    • 分成两部分的矩形 代表 实体集

      2.png

    • 菱形 代表 联系集

      3.png

    • 未分割的矩形 代表 联系集的属性

      4.png

    • 线段 将实体集连接到联系集

      5.png

    • 虚线 将联系集属性连接到联系集

      6.png

    • 双线 显示实体在联系集中的参与度(用双线与联系集相连表示全部参与)
    • 双菱形 代表连接到弱实体集的 标志性实体集

    7.png

  • 映射基数

    • 一对一
    • 一对多
    • 多对一
    • 多对多
  • balabala,图画起来太麻烦了,其他的直接看书,下面聊一聊弱实体集

  • 弱实体集

    • 定义:没有足够的属性以形成主码的实体集称之为 弱实体集(weak entity set)

    • 先举个栗子:(由于简书不支持下划线的写法,所以下面表中所有的主码都用斜体表示)

      • course (course_id, titles, credits)
      • section (sec_id, semester, year)
      • 对于上面的两个实体集,参与如下联系集

        • sec_course(course_id, sec_id, semester, year)
      • 上面的section实体集实际上就是一个弱联系集

        • 一个section实体如果不与一个course对相关联是毫无意义的,并且只有sec_id, semester, year三个属性也是决定不了一个section的
    • 弱实体集必须于另一个称作标识(identifying)或属主和实体集(owner entity set)的实体集相关联才有意义
    • 虽然弱实体集没有主码,但是本身仍要有在依赖于强实体集的基础上的进一步区分的方法,弱实体集的分辨符/部分码(discriminator)便可以用来做进一步的区分
      • 上述例子中的sec_id, semester, year便组成了section的分辨符
      • 在画ER图的时候,组成分辨符的属性底下画虚线(可参见教材 图7-5)
    • 弱实体集的主码由 标识实体集的主码 加上 该弱实体集的分辨符 构成
    • ER图中的表示

      • 组成分辨符的属性底下画虚线,而不是实线
      • 关联弱实体集和标识性强实体集的联系集以双菱形表示
  • 接着,只需要把教材图7-15的图看懂理解,ER图的绘制基本上就没有毛病了

ER图转换为关系模式

这个不难下面简单列几点注意事项

  • 复合属性
    • 将每个子属性单独作为一个属性来处理
  • 派生属性
    • 不显示表示出来
  • 多值属性
    • 单独成表
  • 弱实体集转换
    • 对于从弱实体集转换而来的模式,该模式的主码由其所依赖的强实体集的主码与弱实体集的分辨符组成
  • 联系集
    • 多对多的情况一定单独成表
    • 联系集拥有描述性属性的情况单独成表
    • 其它情况下均可不单独成表
      • 一对一情况下讲任意实体集的主键作为另一个实体集的外建均可
      • 一对多和多对一的情况下,将“一”端的主键作为”多”端的外建
坚持原创技术分享,您的支持将鼓励我继续创作!