65.9K
CodeProject 正在变化。 阅读更多。
Home

准备学习 SQL:8. 数据库范式通俗讲解

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2014年10月23日

MIT

5分钟阅读

viewsIcon

20673

SQL 数据库规范化用简单英语解释

引言

数据库范式化是将数据库组织成表和列的过程。其思想是,一个表应该只关于一个特定的主题,并且只包含支持该主题的列。例如,一个包含销售人员和客户信息的电子表格可以用于多种目的:

  • 识别公司中的销售人员
  • 列出公司所联系的所有客户,以便销售产品
  • 识别哪些销售人员联系特定的客户

通过将一个表限制为一个目的,可以减少数据库中包含的重复数据量,这有助于消除数据库修改带来的一些问题。为了帮助实现这些目标,已经制定了一些数据库表组织规则。组织阶段称为范式;大多数数据库遵循三个范式。随着表满足每个连续的范式,它们发生数据库修改异常的可能性就越小,并且越专注于单一目的或主题。在我们继续之前,请确保您理解数据库表的定义。

范式化的原因

范式化数据库有三个主要原因。第一个是最小化重复数据,第二个是最小化或避免数据修改问题,第三个是简化查询。当我们研究范式化的各个阶段时,我们将讨论每种形式如何解决这些问题,但首先,让我们看看一些未经范式化处理的数据,并讨论一些潜在的陷阱。一旦理解了这些,我认为您将更好地理解范式化数据的理由。考虑以下表格:

注意:主键列已加下划线。

首先要注意的是,此表服务于多个目的,包括:

  1. 识别公司的销售人员
  2. 列出销售办事处和电话号码
  3. 将销售人员与销售办事处关联
  4. 显示每个销售人员的客户

作为 DBA,这会敲响警钟。总的来说,我喜欢看到只有一个目的的表。让表服务于多个目的会带来许多挑战;即,数据重复、数据更新问题和查询数据的额外工作。

数据重复和修改异常

请注意,对于每个SalesPerson,我们都列出了SalesOfficeOfficeNumber。此信息为每个SalesPerson重复。重复的信息带来了两个问题:

  1. 它增加了存储量并降低了性能。
  2. 维护数据更改更加困难。

例如

  • 考虑一下,如果我们把芝加哥办事处搬到伊利诺伊州埃文斯顿。为了在我们的表中正确反映这一点,我们需要更新所有当前在芝加哥的SalesPersons的条目。我们的表是一个小例子,但是您可以想象,如果它更大,这可能涉及数百次更新。
  • 再考虑一下,如果 John Hunt 辞职会发生什么。如果我们删除他的条目,那么我们就丢失了纽约的信息。

这些情况就是修改异常。可能发生三种修改异常:

插入异常

有些事实,我们直到知道整行的信息才能记录。在我们的例子中,我们不能记录一个新的销售办事处,直到我们也知道销售人员。为什么?因为为了创建记录,我们需要提供主键。在我们的例子中,这是EmployeeID

更新异常

相同的信息记录在多个行中。例如,如果办公室号码发生变化,那么需要进行多次更新。如果这些更新未能成功地跨所有行完成,则会发生不一致。

删除异常

删除一行可能会导致删除多组事实。例如,如果 John Hunt 退休,那么删除该行将导致我们丢失有关纽约办事处的信息。

搜索和排序问题

我们考虑的最后一个原因是使搜索和排序数据更加容易。在SalesStaff表中,如果您想搜索特定客户,例如Ford,您需要编写一个查询,如下所示:

SELECT SalesOffice
FROM SalesStaff
WHERE Customer1 = ‘Ford’ OR
      Customer2 = ‘Ford’ OR
      Customer3 = ‘Ford’

显然,如果customer以某种方式放在一个列中,我们的查询将更简单。另外,考虑一下如果您想运行一个查询并按customer排序。按照当前表的定义,除非您使用三个独立的查询和UNION,否则这是不可能的。这些异常可以通过将数据正确地分离到不同的表中来消除或减少,以便将数据存储在服务于单一目的的表中。这个过程称为范式化,您可以达到的各个阶段称为范式。

范式化定义

有三种常见的范式:第一、第二和第三范式。还有几个附加范式,如 BCNF,但我认为那些是高级的,初学者不太需要学习。这些范式是渐进的,这意味着要获得第三范式,表必须首先满足第二范式的规则,而第二范式必须遵守第一范式的规则。在我们详细讨论各种范式和规则之前,让我们总结一下各种范式:

  • 第一范式 - 信息存储在关系表中,每列包含原子值,没有重复的列组。
  • 第二范式 - 表是第一范式,并且所有列都依赖于表的主键。
  • 第三范式 - 表是第二范式,并且其所有列都不是传递依赖于主键。

如果您现在不明白这些规则的含义,请不要太纠结;我们将在下一篇文章中使用示例详细解释它们。现在,重要的是要理解有三个相互构建的规则。更多教程即将推出!记住!我想提醒大家,如果您有其他想解答的问题,请发表评论或在 Twitter 上给我留言。我在这里帮助您。

您还想了解哪些其他主题?

© . All rights reserved.