数据库新手,所以不要对简单的问题感到不安。 就我的谷歌和聚集的知识规范化而言,减少了数据的冗余并提高了性能。但实际上,我不明白将主表划分为其他小表,应用它们之间的关系,使用所有可能的联合,子查询,联接等检索数据的确切原因。为什么我们不能拥有所有数据单个表并根据需要检索它们。我有点困惑。
答案 0 :(得分:15)
主要原因是消除了重复数据,例如,如果您的用户具有多个地址,并且您将此信息存储在单个表中,则用户信息将与每个地址条目一起复制。规范化会将地址分成自己的表,然后使用密钥链接两个地址。这样您就不需要复制用户数据,并且您的数据库结构变得更加清晰。
完全标准化通常不会提高性能,事实上它通常会使情况变得更糟,但它会使您的数据重复免费。事实上,在某些特殊情况下,我已经对某些特定数据进行了非规范化处理,以便提高性能。
答案 1 :(得分:10)
归一化来自于“正常”的数学概念。另一个词是“垂直的”。想象一下常规的双轴坐标系。向上移动只会更改y坐标,移动到侧面只会更改x坐标。因此,每一个动作都可以分解成横向和上下运动。这两者是相互独立的。
数据库中的规范化本质上意味着同样的事情:如果您更改了一段数据,则应该只更改数据库中的一条信息。想象一下电子邮件数据库:如果您将收件人的ID和收件人名称存储在邮件表中,但Users表也将该名称与ID相关联,这意味着如果您更改用户名,则不仅要必须在users表中更改它,但也必须在该用户所涉及的每条消息中更改它。因此,轴“消息”和轴“用户”不是“垂直”或“正常”。
另一方面,如果Mails表只有用户ID,则对用户名的任何更改都将自动应用于所有消息,因为在检索消息时,所有用户信息都是从Users表中收集的(通过加入方式)。
答案 2 :(得分:6)
最简单的数据库规范化是一种最小化数据冗余的方法。为此,存在某种形式的规范化。
第一范式可归纳为:
第二个普通形式增加了另一个限制,基本上每个不属于候选键的列必须依赖于每个候选键(候选键被定义为无法复制的最小列集)在表中。)
第三种常规形式更进一步,因为不是候选键的一部分的每一列都不能依赖于任何其他非候选键列。换句话说,它可以依赖候选键上仅 。这导致说3NF取决于键,整个键而不是键,所以请帮助我Codd 1 。
请注意,上述解释是针对您的问题而非数据库理论家量身定制的,因此描述必须简化(我使用的词语如“概括为”和“基本上”)。
数据库理论领域是一个复杂的领域,如果你真的希望理解它,你最终必须得到它背后的科学。但是,就你的问题而言,希望这是足够的。
规范化是确保我们没有冗余数据的有用工具(如果两个冗余区域不同步,这将成为一个真正的问题)。它通常不会提高性能。
事实上,虽然所有数据库都应该以3NF开始,但有时可以接受2NF以获得性能提升,只要您了解并减轻潜在问题。
请注意,还有“更高”的正常化水平,如(显然)第四,第五和第六,但也有Boyce-Codd和其他一些我记不起来的。在绝大多数情况下,3NF应该绰绰有余。
1 如果你不知道埃德加·科德(或者克里斯托弗·戴德,就此而言)是谁,你应该研究它们,他们是父亲关系数据库理论。
答案 3 :(得分:4)
我们使用规范化来减少由于数据插入,删除,更新而可能出现的异常的可能性。规范化不一定会提高性能。
互联网上有很多资料,所以我不会再重复这里的内容了。但你可以看看 Normalization rules Anomalies (其他人也是)
答案 4 :(得分:1)
除了上述所有内容外,它还具有一定的意义。假设您有一个用户,并且您想要记录他们拥有的汽车类型。
把它全部放在一张桌子上,然后你就没事了,直到有人拥有两辆汽车......然后你需要两排这个人,以及确保你可以连接这两排的方法在一起...
然后如果你还想记录他们有多少只狗呢?同桌有很多令人困惑的重复?另一个表具有您自己的自定义逻辑来管理唯一用户?
规范化使您远离许多这些问题......