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





5.00/5 (9投票s)
SQL 数据库规范化用简单英语解释
引言
数据库范式化是将数据库组织成表和列的过程。其思想是,一个表应该只关于一个特定的主题,并且只包含支持该主题的列。例如,一个包含销售人员和客户信息的电子表格可以用于多种目的:
- 识别公司中的销售人员
- 列出公司所联系的所有客户,以便销售产品
- 识别哪些销售人员联系特定的客户
通过将一个表限制为一个目的,可以减少数据库中包含的重复数据量,这有助于消除数据库修改带来的一些问题。为了帮助实现这些目标,已经制定了一些数据库表组织规则。组织阶段称为范式;大多数数据库遵循三个范式。随着表满足每个连续的范式,它们发生数据库修改异常的可能性就越小,并且越专注于单一目的或主题。在我们继续之前,请确保您理解数据库表的定义。
范式化的原因
范式化数据库有三个主要原因。第一个是最小化重复数据,第二个是最小化或避免数据修改问题,第三个是简化查询。当我们研究范式化的各个阶段时,我们将讨论每种形式如何解决这些问题,但首先,让我们看看一些未经范式化处理的数据,并讨论一些潜在的陷阱。一旦理解了这些,我认为您将更好地理解范式化数据的理由。考虑以下表格:
首先要注意的是,此表服务于多个目的,包括:
- 识别公司的销售人员
- 列出销售办事处和电话号码
- 将销售人员与销售办事处关联
- 显示每个销售人员的客户
作为 DBA,这会敲响警钟。总的来说,我喜欢看到只有一个目的的表。让表服务于多个目的会带来许多挑战;即,数据重复、数据更新问题和查询数据的额外工作。
数据重复和修改异常
请注意,对于每个SalesPerson
,我们都列出了SalesOffice
和OfficeNumber
。此信息为每个SalesPerson
重复。重复的信息带来了两个问题:
- 它增加了存储量并降低了性能。
- 维护数据更改更加困难。
例如
- 考虑一下,如果我们把芝加哥办事处搬到伊利诺伊州埃文斯顿。为了在我们的表中正确反映这一点,我们需要更新所有当前在芝加哥的
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 上给我留言。我在这里帮助您。
您还想了解哪些其他主题?