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