如果我有一个大型系统,我应该使用哪种正常形式:3NF,BCNF,4NF,5NF或更高?
答案 0 :(得分:2)
这取决于。
我建议尽可能规范化 - 即:5NF, - 然后在必要时添加非规范化字段以用于性能或报告目的(将非规范化元素添加到现有规范化数据库要比规范化非规范化结构更容易已经在使用中)
答案 1 :(得分:1)
这取决于。你打算用数据做什么?
您的数据库是否支持在线事务处理(OLTP)?或者它是否旨在支持在线分析处理(OLAP),报告,数据集市或数据仓库活动?
在OLAP情况下,您可能需要考虑设计星型或雪花式架构,而不必担心普通表单。在OLTP情况下,规范化数据库可能比较不规范化的数据库提供更好的结果。
正确的数据有多重要?与自身相矛盾的数据库可能是一个真正的混乱。应该相当的两个输出相互矛盾?怎么会发生这种情况?
好吧,如果数据库在数据库中的几个地方存储相同的事实,它可能以某种方式设法在不同的地方存储该事实的不同且相互矛盾的版本。数据库如何在多个位置存储事实的多个副本?如果它没有完全正常化。
与每个普通表单相关联是插入,更新或删除行时可能发生的一个或多个更新异常。这些异常可以通过相应的正规形式来消除。您可以通过在更新中仔细编程来避免此问题,但是避免使用比避免更加简单。如有必要,请检查正常表格,以熟悉异常情况,并确定它们在您的情况下有多大问题。
更新时的性能有多重要?在查询时间?
有些人敦促您进行规范化以节省数据库中的空间。磁盘空间很便宜。有些人担心处理时间。这通常是微不足道的。由于额外的磁盘访问导致的延迟是显而易见的,但通常是可管理的。
然而,有一个地方无法正常化会导致性能灾难。它是与重负载和保守并发控制相关的瓶颈。大多数DBMS服务器采用保守的并发控制策略,以保护数据免受神秘时序相关的错误,如幻像更新。即使您可以放松并发控制策略,也可以自担风险。
标准差的数据库通常存在这些瓶颈或“热点”。当系统处于轻负载状态时,它们不会浮出水面。该系统可以通过飞行颜色进行beta测试,以减慢实际生产中的爬行速度。备份网站的数据库因出现这个漏洞而臭名昭着。规范化可以通过简化更新事务来帮助您避免这种情况。
那你应该瞄准什么?当我构建数据库时,我通常针对3NF或BCNF。 3NF真的很容易。你只需要确保非关键数据取决于密钥,整个密钥,除了密钥之外什么都没有(所以请帮助我Codd)。我一般不用担心4NF或5NF,但这又取决于你的情况。