《系统设计》课程学习笔记—规范化和反规范化

133 阅读5分钟

术语

在我们进一步讨论之前,让我们看一下规范化(Normalization)和反规范化(Denormalization)中的一些常用术语。

主键(Primary key:):可用于唯一标识表中每一行的列或列组。

复合键(Composite key:):由多列组成的主键。

超键(Super key):可以唯一标识表中所有行的所有键的集合。

候选键(Candidate key):在表中唯一标识行的属性。

外键(Foreign key):它是对另一个表的主键的引用。

备用键(Alternate key):非主键的键称为备用键。

代理键(Surrogate key):当没有其他列能够保存主键的属性时,系统生成的值唯一标识表中的每个条目。

依赖

部分依赖(Partial dependency):当主键决定某些其他属性时术属于部份依赖。

函数依赖(Functional dependency):它是两个属性之间存在的关系,通常是表中主键和非键属性之间的关系。

传递函数依赖(Transitive functional dependency):当某个非关键属性决定某个其他属性时属于这种情况。

异常

当由于不正确的规划或将所有内容存储在平面数据库中而导致数据库存在缺陷时,会发生数据库异常。这通常通过规范化过程解决。

数据库异常有三种类型:

插入异常(Insertion anomaly):当我们无法在数据库中插入某些属性而不存在其他属性时发生。

更新异常(Update anomaly):在数据冗余和部分更新的情况下发生。换句话说,数据库的正确更新需要其他操作,如添加、删除。

删除异常(Deletion anomaly):删除某些数据需要删除其他数据时发生。

例子

让我们考虑以下未规范化的表:

IDNameRoleTeam
1PeterSoftware EngineerA
2BrianDevOps EngineerB
3HaileyProduct ManagerC
4HaileyProduct ManagerC
5SteveFrontend EngineerD

让我们想象一下,我们雇佣了一个新人“John”,但他可能不会立即被分配到一个团队。这将导致插入异常,因为团队属性尚未出现。

接下来,假设团队C的Hailey得到了晋升,为了反映数据库中的变化,我们需要更新2行以保持一致性,这可能会导致更新异常

最后,我们想删除团队B,但要做到这一点,我们还需要删除其他信息,如名称和角色,这是一个删除异常的示例。

规范化

规范化是在数据库中组织数据的过程。这包括根据一些规则创建表和建立这些表之间的关系。这些规则旨在保护数据和通过消除冗余和不一致依赖性使数据库更灵活。

为什么我们需要规范化?

规范化的目标是消除冗余数据并确保数据一致。一个完全规范化的数据库允许扩展其结构,以适应新类型的数据,而不需要太多地改变现有结构。这样与数据库交互的应用程序受到的影响最小。

范式

标准表单是一系列确保数据库规范化的准则。让我们讨论一些基本范式:

1NF

对于处于第一范式(1NF)的表,应遵循以下规则:

  • 不允许重复组。
  • 用主键标识每一组相关数据。
  • 相关数据的集合应具有单独的表。
  • 不允许在同一列中混合数据类型。
2NF

对于处于第二范式(2NF)的表,应遵循以下规则:

  • 满足第一范式(1NF)。
  • 不应具有任何部分依赖关系。
3NF

对于处于第三范式(3NF)的表,应遵循以下规则:

  • 满足第二范式(2NF)。

  • 不允许传递函数依赖关系。

BCNF

Boyce-Codd 范式(或BCNF)是第三范式(3NF)的稍强版本,用于解决最初定义的3NF未处理的某些类型的异常。有时也称为3.5范式(3.5NF)。

对于采用 Boyce-Codd 范式(BCNF)的表,应遵循以下规则:

  • 满足第三范式(3NF)。
  • 对于每个函数依赖项 X->Y、 X应该是超键。

有更多的范式,如4NF、5NF和6NF,但我们这里不讨论它们。

在关系数据库中,如果一个关系满足第三范式,它通常被描述为“规范化的”。大多数 3NF 关系没有插入、更新和删除异常。

与许多正式的规则和规范一样,现实世界的场景并不总是允许完美的遵从性。如果你决定违反规范化的前三条规则之一,请确保你的应用程序预见到可能发生的任何问题,例如冗余数据和不一致的依赖关系。

优点

以下是规范化的一些优点:

  • 减少数据冗余。
  • 更好的数据设计。
  • 提高了数据的一致性。
  • 强制引用完整性。

缺点

让我们看看规范化的一些缺点:

  • 数据设计很复杂。
  • 性能较慢。
  • 维护开销。
  • 需要更多联接。

反规范化

反规范化是一种数据库优化技术,我们将冗余数据添加到一个或多个表中。这可以帮助我们避免关系数据库中代价高昂的联接。它试图以牺牲一些写性能为代价来提高读性能。数据的冗余副本写入多个表中,以避免昂贵的联接。

一旦数据通过联合和分表等技术进行分布,跨网络管理联接将进一步增加复杂性。反规范化可以避免这种复杂联接的需要。

注意:反规范化并不是反向规范化。

优点

让我们看看反规范化的一些优点:

  • 检索数据更快。
  • 编写查询更容易。
  • 减少表数量。
  • 便于管理。

缺点

以下是非规范化的一些缺点:

  • 插入和更新耗费更大。
  • 增加了数据库设计的复杂性。
  • 增加了数据冗余。
  • 数据不一致的可能性更大。