什么时候可以不正常化?

时间:2012-09-23 13:37:25

标签: database-design

考虑以下关系来说明我的问题:

Person( name, street, city, zipcode )

name -> street , city , zipcode
street + city -> zipcode

因此,如果我们知道这个名字,我们也知道这个人住在哪里。但是,邮政编码也是(短暂的)依赖于街道+城市。因此,这种关系会中断3NF,并且应该分成两个表来符合。

但在这种情况下,我们对zipcodes作为一个单独的实体不感兴趣。它是地址的一部分,恰好是瞬态依赖。我们永远不会单独使用它。

我理解为什么规范化是一件好事。但总是规范化(从而使数据库更复杂)真的有必要吗?如果没有,你怎么知道何时可以跳过它?

(如果我的术语或符号错误,欢迎您纠正我)

5 个答案:

答案 0 :(得分:6)

规范化是一种用于分析依赖关系并确保正确实现表示为依赖关系的数据完整性规则(业务规则)的工具。规范化的基本假设是您知道或可以确定您实际想要实施哪些业务规则。如果您已经确定您不想要或不需要强制执行给定的业务规则,那么在为其设计数据库时将其视为依赖项可能没什么价值。请记住,依赖关系点是规则对数据库中所有可能的数据始终有效;不只是针对当前数据或某些特定的数据子集。

可能是依赖{street,city} - > {zipcode}并非真正的系统所需的业务规则,因此不应强制执行。例如。如果必须在没有地址验证软件的情况下输入数据,则确保邮政编码以这种方式保持一致是不切实际的。这并不意味着您违反了任何规范化规则。它只是意味着功能依赖不是意图保持和不保持,因此它不是任何真正意义上的传递依赖。

答案 1 :(得分:5)

除了性能之外,如果您的数据中存在某种“模糊性”,则可能会导致未完全正常化的另一个原因。

据我所知 1 ,ZIP可能特定于城市街区或地区,这意味着特别长的街道可能有多个ZIP。即使ZIP确实对应于美国的城市+街道,对于其他国家的邮政编码也可能不一样,如果您决定走向国际。

但即使假设 ZIP确实是城市+街道特定的,人类可能会自己输入地址信息,这意味着他们可能会犯错误,包括错误的ZIP。因此,对于城市和街道的相同组合,您最终可以使用两个ZIP。

完全规范化的数据库根本无法表示 - 您必须以某种方式选择其中一个 。除非您可以访问所有ZIP的完整,最新的数据库,否则您无法解决此冲突。如果您最终选择了错误的ZIP,则同一城市+街道上的所有人员将使用错误的ZIP。

另一方面,非规范化数据库将让每个人保留自己的ZIP,然后与其他人一起遭受孤立的后果。你甚至可以实现一个自动完成的建议,“你确定吗?”警告以防用户为已有ZIP的现有城市+街道输入不同的ZIP,但如果他表示他确定,则让他(或她)继续进行。


1 而且我不住在美国,所以我可能会离开。

答案 2 :(得分:1)

一直推动标准化的价值和成本取决于。这主要取决于您将对数据进行的操作。

有(至少)两种完全不同的数据使用方式。一种是在线事务处理(OLTP)。另一种是在线分析处理(OLAP)。

在OLTP中,非规范化的成本可能非常高。事务变得更复杂,速度更慢,瓶颈会降低性能。在OLAP中,规范化的好处是有限的,并且还有其他设计规则可以为同样的工作带来更多好处。其中一种替代方案是星型模式设计,您可以查看。

但它不是一个非规范化或非规范化的问题,而是遵循不同的设计规则,即使它不会导致规范化的数据库。

回到您概述的特定情况,有很多系统会对客户活动造成沉重的交易负担,但客户表在这些交易中仅用于读取目的。

当您必须进入新客户时,不符合3NF只会伤害您,并且当已经有其他客户拥有相同的城市,街道和邮编时,您必须重新输入邮政编码码。如果邮局更改了给定街道的邮政编码分配,您将不得不更新许多地址而不是标准化表格中的一行。

这不是一个非常高的成本,而不是一个非常可能的事件。

另一方面,邮局有多大可能只走一条街道,并将该街道分成两个邮政编码,这取决于地址所在街道上的街区?如果后一种情况发生,那么你实际上会更好地使用违反3NF的结构。您可以使用邮局提供的有关拆分的信息,为每个地址输入不同的邮政编码。

那么,第二种情况有多大可能?我认为它比第一次更有可能。但你需要考虑你的猜测,而不是我的。

答案 3 :(得分:1)

我不是美国人,所以我对此犹豫不决,但我认为你不了解zipcodes。一些个别建筑物拥有自己的邮政编码。 Zipcodes可以跨越州界。邮政编码可以代表具有任何地理意义的邮政信箱。

所以,不管归一化的好处,你的例子是一个糟糕的选择。 (街道,城市)和邮政编码之间没有明确的相关性。

我可能有这个错误,但我知道在英国的街道(甚至很短的街道)可以有多个邮政编码。

答案 4 :(得分:0)

如果{street,city} - > {zipcode},则需要让d​​bms知道该约束,以便dbms可以强制执行该约束。否则,您很快就会得到看起来像这样的数据。

name           street              city              zipcode
--
Barack Obama   Pennsylvania Ave    Washington, DC    90210

90210是邮政编码,但它适用于加利福尼亚州的比佛利山庄。

这是一个罕见的应用程序,可以真正容忍这样的坏数据。