一、实体关系建模

1.概念

(1)实体、关系和属性

实体关系建模是一种自顶而下的数据库设计方法,通过定义一些实体(entity)和实体之间的关系(relationship),对实体和关系更细节描绘的属性(attribute)和限制(constraint)来进行建模。其中一种非常重要的方法叫做UML。一些概念如下所述:

  • Entity Type(实体类型): 具有一样性质的对象的集合,它是由用户或公司标识并可独立存在的。可以是实际存在或者概念上存在的,例如员工、产品、工作经验、销售。
    • Strong entity(强实体): 一个不依托于其他实体的主健的存在而存在的实体。
    • Weak entity(弱实体): 一个依托于其他实体的主健的存在而存在的实体。
      强实体和弱实体
  • Entity occurrence(实体呈现): 实体中的一个独一可标识的对象。
  • Relationship Type (联系类型): 实体间有意义的联络。
  • Relationship occurrence(联络呈现): 两个实体呈现之间的独一可标识的联络。
  • Degree of Relationship Type(联系类型的度):一个关系中参与的实体数量。度为2叫做binary(最常见),度为3叫做ternary,度为4叫做quaternary。
  • Recursive Relationship(递归型联系):同一个实体类型用不同的身份在一个联系中参与了多次。
    递归型联系
  • Attribute(属性):实体类型和联系类型的属性。属性可以分为很多类
    • Attribute domain(属性域):一个或多个属性所有可能的值的集合。不同的实体可能有相同的属性域
    • Simple attribute(简单属性):由单一部分组成的属性
    • Composite attribute(复合属性):由多个部分组成的属性,例如地址可以被划分成街道、城市、邮编三个部分
    • Single-valued attribute(单值属性):包含单一值的属性
    • Multi-valued attribute(多值属性):包含多个值的属性,例如电话号码可以有多个
    • Derived attribute(派生属性): 表示其值能够从一个有关属性和属性集的值派生得到的属性,这个属性在实体中不是必需的。例如租期属性可以由开始日期和结束日期计算出来。
    • Candidate key(候选键): 仅包括独一标识实体所必需得最小属性的数量。
    • Primary key(主健): 用来标识每个实体的呈现的候选键。一个实体类型可以有多个Candidate key,我们选择一个作为Primary key,其他作为alternate key。
    • Composite key(复合键): 包括两个及以上属性的Candidate key

(2)约束

Structural Constraints(结构约束):参与一个联系的实体之间可能存在的约束。约束包括以下几种:

  • Multiplicity(多样性): 定义与某个有关实体的一次呈现有关的实体的呈现数目。包括一对一、一对多、多对多。我们通过具体的样本数据来确定属于那种联系。Multiplicity包含两种约束,分别是
    • Cardinality constraint(基数约束): 描画每个参与实体的能够的联系的最大数目。
    • Participation constraint(参与约束): 确定是不是所有或者仅仅是某些实体呈现参与到联络中,也可以理解成联系的最小数目。

2.ER图绘制

使用长方形来表示实体,实体中每一个单词的首字母通常大写。
使用一条连接两个实体的线表示联系并标注联系的名字,一个关系只能标注一个方向。
简单的实体与联系
使用菱形来表示度大于2的联系类型。
度为4的联系
在递归型联系或者两个实体间存在多个联系的情况下,我们需要标注实体所扮演的角色。
表示角色
对于属性,我们将长方形分为两部分,上面为实体名字,下面为属性。第一个属性应该是Primary key,添加tag {PK},属性的第一个单词首字母要小写,其余单词的首字母大写。另外,我们也可以添加{PPK}来代表Composite key,以及{AK}来代表 alternate key。

在一些复杂数据库系统中,我们可能不需要添加全部的属性,但是要添加Primary key,此时可不添加tag。

对于多值属性,我们会标记取值范围。对于派生属性,我们添加前缀/。一个例子如下所示。

属性和建
对于关系的属性,我们仍然使用一个长方形来代表属性,为了和实体进行区别,我们使用虚线来绘制。
在这里插入图片描述
多样性约束:在表示实体的长方形旁边我们通过两个点来表示具体的约束类型,例子如下:

一对一:
在这里插入图片描述
一对多:
在这里插入图片描述
多对多:
在这里插入图片描述

3.实体关系模型存在的问题

(1)Fan Traps

Fan trap(扇形圈套): 模型表示实体类型之间的关系,但某些实体出现之间的路径不明确。

当一个实体存在至少两个一对多关系,此时会出现扇形圈套,例子如下:
在这里插入图片描述
从上图我们可以知道一个division有至少一个staff,一个division至少操作一个branch。接下来我们通过一些数据绘制semantic net。
在这里插入图片描述
此时如果我们想知道员工SG37在哪个branch,我们只能知道在B003或者B007,这就是扇形圈套。

为了解决这个问题,我们重建实体关系模型来表示实体之间正确的联系,如下所示。
在这里插入图片描述

(2)Chasm Traps

Chasm trap(深坑圈套): 模型表明实体类型之间存在关系,但某些实体事件之间不存在路径。

当存在至少一个最小多样性约束为0的关系形成相关实体之间的路径的一部分时,可能会出现深坑圈套。例子如下图:在这里插入图片描述
通过这个ER图,当我们想知道Branch和PropertyForRent之间的联系时,由于Staff和PropertyForRent相互之间的最小约束均为0,我们无法判断Branch和PropertyForRent之间的联系。解决方法是在Branch和PropertyForRent之间添加一个联系,如下图
在这里插入图片描述

二、增强实体关系建模

附加额外的语义概念的实体关系模型被叫做增强实体关系模型(EER)。本节我们描述了 EER 模型中三个最重要和最有用的附加概念。

1.Specialization/Generalization

(1)Superclasses and Subclasses(超集和子集)

我们可以将实体类型形成为包含超类和子类的层次结构。

  • 超类:一种实体类型,包括其出现的一个或多个不同的子组,必须在数据模型中表示。
  • 子类:实体类型出现的不同子组,必须在数据模型中表示。

有独特子类的实体类型叫做超类。举例说明:实体员工被认为是子类经理、秘书、销售员的超类。超类和其中一个子类的关系叫做超类/子类联系。引入子类/超类重要的原因是对于不同子类,他们的属性可能并不相同,例如经理具有独特的属性分红,而销售具有独特的属性销售领域,如果我们仅仅将员工作为一个实体,我们会有很多空白的属性。

  • 属性继承:一个子类除了他们拥有的独特的属性还会继承来自超类的属性。
  • Type hierarchy(类型层次结构):一个实体以及它的子类和它的子类的子类
  • shared subclass(共享子类):有超过一个超类的子类

Specialization(特化): 通过识别实体成员的显着特征来最大化实体成员之间差异的过程。
特化是一种自顶而下的方法来定义超集的集合和对应的子集。子类的集合是根据超类中实体的一些显着特征来定义的,当我们定义子集后,我们将特定的属性关联到每个子集,之后再定义子集和其他实体或子集之间的联系。例如我们有一个实体员工,我们就尝试寻找员工实体中成员的区别,比如员工里有经理、会计、销售员等,我们将这些作为员工的子集即可。

Generalization(泛化):通过识别实体的共同特征来最小化实体之间差异的过程。
泛化是一种自底而上的方法,从原有的实体类型得到一个泛化的超集。例如我们有经理、会计、销售三个实体,我们可以泛化出员工实体作为超集。泛化可以被视为特化的反向过程。

(2)ER图画法

我们通过直线+三角形来连接子类和超类,子类独有的属性在子类的长方形中表示,(Optional, And)表示约束。子类可以和其他的实体进行联系,如下图子类Manager和实体Branch存在联系。
在这里插入图片描述
我们可以通过不同的特征来表示不同的特化。如下图员工实体包含两组特化,一组是经理、销售和秘书,另一组是全职员工和兼职员工。
在这里插入图片描述
下图展现了Type hierarchy(类型层次结构),我们可以看到助理秘书是秘书的子类,他除了拥有自己独特的属性,也拥有秘书和员工的属性;销售经理是销售和经理的共享子类,他包含销售和经理和员工的所有属性。
在这里插入图片描述

(3)泛化/特化的约束

Participation constraint(参与约束): 确定超类中的每个成员是否必须作为子类的成员参与。约束分为两种,mandatory(强制)和optional(可选)

  • mandatory(强制):超类中的每个成员也必须是子类的成员。例如上面第二个图,员工必须是全职/兼职。
  • optional(可选):超类中的成员可以不属于任何一个子类

Disjoint constraint(无衔接约束): 描述子类成员之间的关系,并指示超类的成员是否可能成为一个或多个子类的成员。当超类有多个子类时需要判断是否衔接

  • Or:如果子类是不相交的,意味着一个实体呈现只能是其中一个子类的成员。
  • And:如果子类是相交的,意味着一个实体呈现可以是多个子类的成员

2.Aggregation

Aggregation(聚合):表示实体类型之间的“has-a”或“is-part-of”关系,其中一个表示“整体”,另一个表示“部分”。

当我们想表示其中一个实体是大的实体(whole),包含另一个小的实体(parts)。例如“has”联系。聚合不会改变整体与部分之间关系的导航意义,也不会链接整体及其部分的生命周期。

在ER图上,我们在大的实体的一端添加一个透明的菱形代表聚合。
在这里插入图片描述

3.Composition

Composition(组成):一种特定形式的聚合,表示实体之间的关联,其中“整体”和“部分”之间存在强大的所有权和巧合的生命周期。

例如实体报纸和实体广告之间存在的展示联系,而报纸和广告之间存在和强烈的生命周期联系,所以他们属于组成。

在ER图中,我们使用实心菱形来代表组成关系。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐