4.1 简介

通过将数据库表转换为常规表,您现在可以分析它们之间的关系。两个相关表之间交互的元素数称为基数。基数可帮助您控制将数据分区到表中的效率。

从理论上讲,所有实体之间都可以保持相互关系,但在实践中,实体之间存在三种类型的关系:

  • 一对一
  • 一对多
  • 多对多

4.2 一对一沟通

如果对于实体 B 的每个实例只有一个实体 A 的实例,则称它们具有一对一的关系(通常表示为“1:1”)。在 ER 图上,这种关系由两端各有一个小条的线表示:

1:1 关系通常表示,除非您有充分的理由将它们分开,否则最好将两个表的数据合并为一个。

但是,在某些情况下,使用具有 1:1 关系的表是合理的。如果您的表包含可选数据的字段,例如描述,并且在很多情况下它们是空的,那么将所有描述移动到一个单独的表是有意义的,这将使您摆脱频繁的空白并提高数据库的效率.

然后,为了正确映射数据,您必须在每个表中至少包含一个相同的列(最好为此选择一个主键)。

4.3 一对多关系

当一个表中的记录与另一个表中的多个实体相关联时,就会出现这种类型的关系。例如,同一个客户可以下多个订单,或者一个图书馆访问者可以在一次访问中借到多本书。一对多关系(或简称 1:M)在图表中使用鱼尾纹表示法表示,如下例所示:

要在规划数据库时应用 1:M 关系,只需将“一”表的主键作为属性添加到“多”表。如果主键在另一个表中,则称为“外键”。“一”表被认为是父表,而“多”表被认为是子表。

4.4 多对多关系

当一个表中的多个实体可以连接到另一个表中的多个实体时,它们被认为具有多对多(或 M:M)关系。例如,学生和班级之间存在这种关系,因为每个学生可以参加几个不同的班级,因此每个班级可以有很多学生。

在ER图上,这种关系显示如下:

不幸的是,不可能在数据库中直接实现这样的关系。因此,它必须拆分为两个一对多关系。

为此,您需要在两个表之间创建一个新实体。如果在销售和产品之间建立了 M:M 关系,那么新的实体可以称为“已售出的产品”,因为它将代表每次销售的内容。

“goods sold”和“sales”表以及“goods”表将按类型 1:M 链接。在不同的模型中,这种中间实体的名称不同——“连接表”、“关联实体”或“节点表”。

每个链接表记录连接相邻表的两个不同实体(并且还可能包含附加信息)。例如,学生和班级之间的链接表可能如下所示:

4.5 强制与否?

链接分析的另一种方法是确定哪个连接的实体是另一个实体存在的先决条件。可选链接侧在树干上用圆圈标记。

例如,为了让一个国家在联合国有自己的代表,它必须存在于世界地图上,但相反的说法是错误的:

两个实体可以相互依赖(也就是说,一个实体不能没有另一个实体存在)。

递归链接

有时一个表可以引用它自己。例如,员工表可能有一个“经理”属性,可以将我们引向同一张表中的另一名员工。这就是递归关系。

额外连接

如果链接被表达多次,则认为它们是多余的。通常,可以删除其中一个而不会丢失重要信息。例如,如果实体“students”不仅直接连接到实体“teachers”,还通过“classes”间接连接到实体“teachers”,那么删除实体“students”和“teachers”之间的关系是有意义的。这个决定是合理的,因为只能通过班级将学生分配给教师。

4.6 数据的引用完整性

更改主键和外键时,应注意数据的引用完整性等方面。它的主要思想是保持数据库中存储相同数据的两个表的一致性。

数据完整性表示表之间正确建立的关系以及它们之间的正确链接。在什么情况下会破坏数据完整性:

  • 删除异常。从主表中删除一行时发生。在这种情况下,从属表中的外键继续引用主表中已删除的行。
  • 插入异常。在将行插入从属表时发生。在这种情况下,从属表中的外键与主表中任何行的主键都不匹配。
  • 更新异常。出现这种异常情况,一张表的几行可能包含属于同一个对象的数据。如果更改一行中的数据,它们可能会与另一行中的数据发生冲突。

删除异常

要解决删除异常,应将外键设置为两个约束之一:

如果从属表中的一行必然需要主表中的一行,则外键设置为级联删除。也就是说,当从主表中删除一行时,相关联的行也会从从属表中删除。

如果从属表中的一行不允许与主表中的行有任何关系(即,这种关系是可选的),则当从主表中删除相关行时,外键将设置为 NULL。外键列必须可以为空。

插入异常

为解决添加到依赖数据表时的插入异常,代表外键的列必须可以为空。因此,如果要添加的对象与主表没有关联,则外键列将具有 NULL 值。

更新异常

为了解决更新异常问题,应用了规范化,这在前面已经讨论过。