当前位置:  开发笔记 > 运维 > 正文

Overnormalization

如何解决《Overnormalization》经验,为你挑选了3个好方法。

何时将数据库设计描述为过度标准化?这种特征是绝对的吗?或者它取决于它在应用程序中的使用方式?谢谢.



1> Nicholas Pia..:

从一般意义上讲,我认为过度规范化是指当你执行如此多的JOIN来检索数据时,它会导致显着的性能损失和数据库死锁,即使在你调整了索引之后也是如此.显然,对于像MySpace或eBay这样的大型应用程序和网站,去规范化是一种扩展要求.

作为几家小型企业的开发人员,我告诉你,根据我的经验,从规范化 - >非规范化而不是相反的方式变得更容易,实际上是反过来(以避免现在的业务重复要求已经改变了一年左右)更难.

当我读到诸如"你应该把地址放在你的客户表中而不是单独的地址表中以便你可以避免加入"这样的一般性陈述时,我不寒而栗,因为你只知道从现在起一年后有人会要求你做您完全没有预见的地址,例如维护审计跟踪或每个客户存储多个地址.如果您的数据库允许您创建索引视图,则可以回避该问题,直到您的数据集如此之大以至于不可能存在或由1-中的单个服务器或服务器集提供服务为止.写,多读环境.对于我们大多数人来说,我不认为这种情况会经常发生.

如果有疑问,我会瞄准第三范式而有一些例外(例如,有一个字段包含分隔字符串的CSV列表,因为我知道我永远不会从另一个角度查看数据).当我需要整合时,我会首先查看我的观点或索引.希望这可以帮助.


@JonathanLeffler每个数据库都不同,因此禁止使用"始终以BCNF为目标"这样的规则.规范化有好处,但也有缺点.您是否知道在插入重型环境中插入索引列可能会导致显着的性能损失(不希望在没有索引的情况下加入),具体取决于索引类型?此外,加入不是一个自由操作,所以如果你加入一个表来获取另一个的子集,依此类推8链,加入性能可能会给大表增加一些讨厌的开销(> 100M记录).有时非规范化有好处.

2> JasonTrue..:

它始终是应用程序域的问题.这通常是正确性的问题,但偶尔也会出现性能问题.

有一种情况我可以想象一个过度标准化的初步证据:说你有订单+订单,订单项引用productID,并将价格留给product.price.由于这引入了时间耦合,因此过度标准化会影响已经发货的订单,因为这种情况绝对不会发生变化.你当然可以说这只是一个建模错误(如评论中所述),但我认为在大多数情况下,规范化不足也是一种建模错误.

另一类是与绩效相关的.原则上,我认为通常有更好的解决方案来实现比非规范化数据,例如物化视图,但如果您的应用程序遭受许多连接的性能影响,那么可能值得评估非规范化是否可以帮助您.我认为这些案例经常被过分强调,因为人们有时会在正确描述其应用之前达到非规范化.

人们也经常忘记替代方案,例如保持数据库的规范形式,并使用仓库或其他策略来频繁阅读但不经常更改的数据.


时间耦合是一个很好的观点,在实现上线30天之前,它很容易被忽略。不是我去过那里。

3> S.Lott..:

标准化是绝对的.数据库遵循普通表格,或者不遵循.有六种正常形式.大多数情况下,他们的名字从第一到第五.另外还有Boyce-Codd Normal Form.

归一化仅用于一个目的 - 防止"更新异常".

归一化不是主观的.这不是判断.表中的每个表和关系都遵循或不遵循正常形式.

因此,您不能"过度规范化"或"规范不足".

话虽如此,规范化具有性能成本.有些人选择以各种方式进行非规范化以提高性能.最常见的合理的非规范化是打破3NF并包括派生数据.

一个常见的错误是打破2NF并在密钥和非密钥值之间具有功能依赖的重复副本.这需要额外的更新或 - 更糟糕 - 触发器以保持副本并行.

事务数据库的非规范化应该是个案情况.

数据仓库也很少遵循任何事务规范化规则,因为它(基本上)从未更新过.

"过度规范化"可能意味着数据库因为大量连接而太慢.这也可能意味着数据库已经超出了硬件.或者说应用程序还没有按比例设计.

这里最常见的问题是人们在事务进行时尝试使用事务数据库进行报告.事务锁定会干扰报告.

但是,"规范不足"意味着存在NF违规,并且正在进行不必要的处理以处理复制的数据并纠正更新异常.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有