16

数据库新手,所以不会对简单的问题感到不安。就我的谷歌搜索和收集的知识规范化而言,减少了数据冗余并提高了性能。但实际上,我不明白将主表划分为其他小表、应用它们之间的关系、使用所有可能的联合、子查询、连接等检索数据的确切原因,为什么我们不能拥有所有数据一个表并根据需要检索它们。我有点困惑。

4

5 回答 5

17

主要原因是为了消除数据的重复,例如,如果您有一个具有多个地址的用户,并且您将此信息存储在一个表中,则用户信息将与每个地址条目一起重复。规范化会将地址分离到它们自己的表中,然后使用键将两者链接起来。这样您就不需要复制用户数据,并且您的数据库结构变得更加清晰。

完全规范化通常不会提高性能,实际上它通常会使性能变得更糟,但它会使您的数据不重复。事实上,在一些特殊情况下,我已经对一些特定数据进行了非规范化以提高性能。

于 2009-07-09T08:48:44.520 回答
10

归一化来自“正常”的数学概念。另一个词是“垂直的”。想象一个常规的两轴坐标系。向上移动只是改变 y 坐标,向侧面移动只是改变 x 坐标。所以每一个动作都可以分解为横向和上下运动。这两个是相互独立的。

数据库中的规范化本质上意味着同样的事情:如果您更改一条数据,这应该只更改数据库中的一条信息。想象一个电子邮件数据库:如果您将 ID 和收件人的姓名存储在 Mails 表中,但 Users 表也将姓名与 ID 相关联,这意味着如果您更改用户名,您不仅必须在用户表中更改它,而且还要在该用户涉及的每条消息中进行更改。因此,轴“消息”和轴“用户”不是“垂直”或“正常”。

另一方面,如果 Mails 表只有用户 ID,对用户名的任何更改都将自动应用于所有消息,因为在检索消息时,所有用户信息都从 Users 表中收集(通过加入)。

于 2009-07-09T08:50:02.397 回答
6

最简单的数据库规范化是一种最小化数据冗余的方法。为了实现这一点,存在某些形式的标准化。

第一范式可以概括为:

  • 单个表中没有重复组。
  • 相关信息的单独表格。
  • 表中与主键相关的所有项目。

第二范式增加了另一个限制,基本上不属于候选键的每一列都必须依赖于每个候选键(候选键被定义为表中不能重复的最小列集)。

第三范式更进一步,因为不是候选键一部分的每一列都不能依赖于任何其他非候选键列。换句话说,它只能依赖候选键。这导致了这样的说法,即 3NF 取决于密钥,整个密钥,只有密钥,所以请帮助我 Codd 1

请注意,上述解释是针对您的问题而不是数据库理论家量身定制的,因此必须简化描述(并且我使用了“总结为”和“基本上”之类的短语)。

数据库理论领域是一个复杂的领域,如果你真的想了解它,你最终必须了解它背后的科学。但是,就您的问题而言,希望这将是足够的。

规范化是一种有价值的工具,可以确保我们没有冗余数据(如果两个冗余区域不同步,这将成为一个真正的问题)。它通常不会提高性能。

事实上,虽然所有数据库都应该从 3NF 开始,但有时为了提高性能,降低到 2NF 是可以接受的,前提是您了解并减轻了潜在问题。

并且请注意,还有“更高”级别的正常化,例如(显然)第四,第五和第六,还有 Boyce-Codd 和其他一些我不记得的人。在绝大多数情况下,3NF 应该绰绰有余。


1如果您不知道 Edgar Codd(或 Christopher Date,就此而言)是谁,您可能应该研究他们,他们是关系数据库理论之

于 2009-07-09T08:45:38.707 回答
4

我们使用标准化来减少由于数据插入、删除、更新而可能出现的异常情况。规范化不一定会提高性能。

互联网上有很多资料,所以我不再在这里重复这些内容。但是你可以看看 Normalization rules Anomalies (others as well)

于 2009-07-09T08:43:05.153 回答
1

除了以上所有,它只是有一定的意义。假设您有一个用户,并且您想记录他们拥有什么样的汽车。

把所有东西放在一张桌子上然后你就没事了,直到有人拥有两辆车......然后你需要为那个人提供两行,以及确保你可以将这两行链接在一起的方法...... .

如果你还想记录他们有多少只狗呢?同一张桌子有很多令人困惑的重复?另一个具有您自己的自定义逻辑来管理唯一用户的表?

规范化让你远离很多这些问题......

于 2009-07-09T09:57:40.637 回答