数据库 之 概念模型-ER图

抽象 -> 区分 -> 命名 -> 表达

ER模型 (Entity-Relation)

理论

实体 & 实例:

实体 实例
用属性刻画 用实体的值刻画(元组)
型(Type) 值(Value)
模式(Schema) 数据(data)
数据模型(Data Model) 模式(Schema)
模式(Schema) 实例(Instance)
类(Class) 对象(Object)
  • 实体就是客观存在并可以相互区分的事务:可用重叠量词描述(一个个、一件件…)

  • 实体必须给出关键字:区分每个实例

实体集:

  • 域:属性允许取值的集合
  • 属性种类:
    简单属性 & 复合属性
    单值属性 & 多值属性
    派生属性

联系集

用来表示实体集之间的联系

  • 参与联系的实体集数量:一元联系,二元联系…

  • 任何非二元联系都可以转换为二元联系:人为的创建实体集(将多元联系按实体集拆分开来:再分别映射连接到一个引入的实体集)=》 细化Relationship

Q1: 三元联系转换为二元联系的例子:
A1: 三元联系parents(father, mather, child) ==> father(f, child) & mather(m, child)

Q2: 有些三元联系更自然,例子:
A2: proj_guide(instructor, project, student)

角色(Role)

  • 自环联系集(Recursive Relationship Set):通过Role来标识不同元组的参与方式
    eg:

映射基数 (Mapping Cardinality)

  • 一般用于描述二元联系集:参与的两个实体的参与情况:1对1,1对多 …

联系集的候选码依赖于集合的映射基数:
1对多:多的一方可作为Canditate Key(能唯一标识一个联系)
eg:一个老师对应多个学生:可用学生id作为Relationship(student, teacher)的CK
多对多:Super Key = Canditate Key

-> 基数约束

Q1: 举出一个1对多拆分为1对1的例子,并说明好处是什么?

全参与 (Total) & 部分参与(Partial Participation)

  • 全参与:实体集中每个实体都在Relationship中至少有一个联系对 (NOT NULL)
  • 部分参与:有些实体没参与到联系中 (可以取NULL)

实体集中一个实体参与到联系的数目:下限由全参与(至少是1) 还是部分参与 (0)决定,上限由映射基数(1还是n)决定

teacher --[0, *]-- \ --[1, 1]-- student
[0, *] : 0=Partial, *=单端(一个老师可以有多个学生,每个老师可以参与到多个联系中 -> 1对多 中的1端)
[1, 1] : 1=Total, 1=多端(一个学生只有一个老师,每个学生只能参与一个联系中 -> 1对多 中的多端)

弱实体集 & 强实体集

  • 弱实体集: 没有主码,只能依附于宿主实体集存在 (类似于宿主实体集候选码的“子属性”)

  • 弱实体集的部分码:一个弱实体集中能区分所有实体的属性集合

  • 弱实体集的主码 = 宿主实体集的主码 + 它的部分码

标识性联系 Indentify Relationship: 宿主实体集(1端) 与 弱实体集(多端) 之间的联系

  • 可以看作是一种减少冗余的方式:通过Indentify Relationship将弱实体集的主码隐含在宿主实体集中

特化 Specialization / 概化 Generalization

对 特化 / 概化 的设计约束

聚集

引入复合实体集

ER图的画法:

ER图:建模

Step 1: 理解需求 寻找实体(一个个…)
Step 2: 用属性刻画实体
Step 3: 确定每个实体的关键字 / 码(唯一标识)
Step 4: 重点是分析实体间的联系,并刻画联系的(属性,基数…)
Step 5: 检查是否覆盖了需求 (语义:内容 / 绘图:语法)

陈方法

  • 缺陷:组合属性,多值属性,和导出属性的表达

Crow’s foot方法

IDEF1x方法(工程化)

  • 特点: 在实体中反映了联系(FK )

将ER图导出为数据库表

Step 1:将所有Entity, Relation => Table
Step 2: 去重 合并

  1. 强实体集属性不变
  2. 弱实体集添上所依赖的主键(宿主实体集的)
  3. 复合属性 / 多值属性
  4. 联系集:实体集们的主键属性 + 自己的属性

表的冗余:

你可能感兴趣的:(数据库)