跳转到内容

数据库设计/ER建模

来自维基教科书,开放世界中的开放书籍

为实体关系 (ER) 模型开发的一个重要理论涉及函数依赖 (FD) 的概念。 学习这个理论的目的是为了提高你对数据之间关系的理解,并获得足够的正式性来帮助实际数据库设计。

与约束一样,FD 来自应用领域的语义。本质上, 函数依赖描述了各个属性是如何相关的。FD 是关系中属性之间的一种约束,有助于构建良好的关系模式设计。在本章中,我们将探讨

  • 函数依赖的基本理论和定义
  • 用于改进模式设计的方法,也称为规范化

关系设计与冗余

[编辑 | 编辑源代码]

通常,良好的关系数据库设计必须捕获所有必要的属性和关联。设计应该以最少的信息存储量和没有冗余数据来做到这一点。

在数据库设计中,冗余通常是不希望的,因为它会导致更新后维护一致性方面的问题。但是,冗余有时会导致性能提高;例如,当冗余可以代替连接来连接数据时。连接用于根据两个相关表获取信息。

考虑图 10.1: 客户 1313131 显示了两次,一次是账户号 A-101,一次是账户 A-102。在这种情况下,客户号并不冗余,尽管表中存在删除异常。拥有单独的客户表可以解决这个问题。但是,如果分支地址发生变化,则需要在多个地方更新它。如果客户号保留在表中,那么就不需要分支表,也不需要连接,从而提高了性能。

图 10.1. 使用银行账户和分支的冗余示例。

插入异常

[编辑 | 编辑源代码]

当你在表中插入不一致的信息时,就会发生插入异常。当我们插入新记录时,例如图 10.2 中的账户号 A-306,我们需要检查分支数据是否与现有行一致。

图 10.2. 插入异常示例。

更新异常

[编辑 | 编辑源代码]

如果分支地址发生变化,例如图 10.3 中的 Round Hill 分支,我们需要更新所有引用该分支的行。错误地更改现有信息称为更新异常

图 10.3. 更新异常示例。

删除异常

[编辑 | 编辑源代码]

当删除可能包含不应删除的属性的记录时,就会发生删除异常。例如,如果我们删除有关某个分支的最后一个帐户的信息,例如图 10.4 中 Downtown 分支的帐户 A-101,所有分支信息都会消失。

图 10.4. 删除异常示例。

删除 A-101 行的问题是我们不知道 Downtown 分支位于何处,我们丢失了关于客户 1313131 的所有信息。为了避免这类更新或删除问题,我们需要将原始表分解成几个较小的表,其中每个表与其他表的重叠最小。

每个银行帐户表必须包含有关一个实体的信息,例如图 10.5 中显示的 分支或客户。

图 10.5. A. Watt 所示的每个银行帐户表都包含一个实体。

遵循此做法将确保在添加或更新分支信息时,只会影响一条记录。因此,当添加或删除客户信息时,分支信息不会被意外修改或记录错误。

示例:员工项目表和异常

[编辑 | 编辑源代码]

图 10.6 显示了一个员工项目表的示例。从该表中,我们可以假设

  1. EmpID 和 ProjectID 是一个组合主键。
  2. 项目 ID 决定预算(即,项目 P1 的预算为 32 小时)。

图 10.6. A. Watt 所示的员工项目表示例。

接下来,让我们看看在以下步骤中,该表可能会发生的一些可能的异常。

  1. 操作:添加行 {S85,35,P1,9}
  2. 问题:有两个元组的预算冲突
  3. 操作:删除元组 {S79, 27, P3, 1}
  4. 问题:步骤 #3 删除了项目 P3 的预算
  5. 操作:将元组 {S75, 32, P1, 7} 更新为 {S75, 35, P1, 7}
  6. 问题:步骤 #5 为项目 P1 的预算创建了两个元组,其值不同
  7. 解决方案:为项目和员工分别创建一个单独的表,如图 10.7 所示。

图 10.7. 解决方案:A. Watt 所示的为项目和员工分别创建单独的表。

如何避免异常

[编辑 | 编辑源代码]

创建没有异常的表的最佳方法是确保表已规范化,这是通过理解函数依赖来实现的。FD 确保表中的所有属性都属于该表。换句话说,它将消除冗余和异常。

示例:分离项目和员工表

[编辑 | 编辑源代码]

图 10.8. A. Watt 所示的分离项目和员工表及其数据。

通过使用单独的项目和员工表来保持数据分离

  1. 如果预算发生变化,不会产生任何异常。
  2. 没有分配员工的项目不需要虚拟值。
  3. 如果删除员工的贡献,不会丢失任何重要数据。
  4. 如果添加员工的贡献,不会产生任何异常。

关键词

[编辑 | 编辑源代码]
删除异常
当删除可能包含不应删除的属性的记录时,就会发生
函数依赖 (FD)
描述了各个属性是如何相关的
插入异常
当你在表中插入不一致的信息时,就会发生
连接
用于根据两个相关表获取信息
更新异常
错误地更改现有信息
  1. 将图 10.9 规范化。 图 10.9. 第 1 题的表格,由 A. Watt 提供。
  2. 为在线电影租赁服务创建逻辑 ERD(没有多对多关系)。 使用以下操作描述作为您的业务规则的基础:在线电影租赁服务根据电影类型对电影标题进行分类:喜剧、西部片、古典片、科幻片、卡通片、动作片、音乐剧和新上映。 每个类型包含许多可能的标题,大多数类型的标题都有多个副本。 例如,请注意以下摘要:类型 标题 音乐片 我的窈窕淑女 (副本 1) 我的窈窕淑女 (副本 2) 俄克拉荷马州 (副本 1) 俄克拉荷马州 (副本 2) 俄克拉荷马州 (副本 3) 等等
  3. 数据冗余可能导致哪些三种数据异常? 如何消除这些异常?

另请参阅  附录 B:ERD 示例练习

数据库设计(包括图像,除非另有说明)的这一章是 Nguyen Kim Anh 编写的关系设计理论的衍生作品,根据知识共享署名许可 3.0 许可发布

以下材料由 Adrienne Watt 撰写

  1. 示例:员工项目表和异常
  2. 如何避免异常
  3. 关键词
  4. 练习

参考资料

[编辑 | 编辑源代码]
华夏公益教科书