【问题标题】:Is denormalizing acceptable in this case?在这种情况下可以接受非规范化吗?
【发布时间】:2011-04-08 14:03:57
【问题描述】:

我有以下locations 表:

----------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude |
----------------------------------------------------------

还有phones 表:

-----------------------
| locationID | number |
-----------------------

现在,请记住,对于任何捐赠商店,最多可以有五个电话号码。顺序无关紧要。

最近我们需要添加另一个表,其中包含与商店相关的信息,其中还包括电话号码。

现在,此新表不应用 locationID,因此我们无法将电话存储在以前的电话表中。

最终,保持数据库规范化需要 2 个新表和总共 4 个连接来检索数据。对其进行非规范化会使旧表呈现为:

----------------------------------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude | phone1 | ... | phone5 |
----------------------------------------------------------------------------------

总共有 2 个表和 2 个连接。

我不喜欢拥有data1data2data3 字段,因为这可能会带来巨大的痛苦。那么,你的意见是什么。

【问题讨论】:

    标签: sql database database-design data-modeling denormalization


    【解决方案1】:

    我认为您的问题源于错误的模型。

    为什么你有一个位置 ID 和一个商店 ID?一家商店可以占据多个位置吗? 电话号码是否与地理位置相关联?

    只需通过 StoreId 键入所有内容,您的问题就会消失。

    【讨论】:

    • 是的,一个商店可以有多个位置,并且电话与位置相关,因此位置 ID(用于电话)。
    • 在这种情况下,保持正确的标准化模型并进行三/四表连接!它只是多一点编码,只要键被索引它就不会花费你任何东西。
    【解决方案2】:

    只需尝试将您的新表与旧位置表关联起来,因为这两个表都代表您应该能够以某种方式将两者关联起来的商店。如果你能做到,你的问题就解决了,因为你可以像以前一样继续使用电话桌。

    将新表与旧位置表关联起来,不仅可以帮助您获取电话号码

    【讨论】:

      【解决方案3】:

      我的观点是,非规范化是你为了获得性能而做的事情,如果,只有,你确实有性能问题。我总是为 3NF 设计,只有在绝对必要时才恢复。

      这不是为了让查询看起来更好而做的事情。任何体面的数据库开发人员都不会害怕中等复杂的 SQL 语句,尽管我不得不承认我见过一些让我不寒而栗的多百行语句 - 请注意,这些来自无法控制架构的客户: DBA 会首先重新设计架构以避免这种怪物。

      但是,只要您对去规范化带来的限制感到满意,您就可以为所欲为。好像没有一群 3NF 警察在地球上漫游寻找违规者:-​​)

      我可以看到的直接限制(可能还有其他限制)是:

      • 您将被限制(最初,无需更改架构)每个位置只能使用五个电话号码。根据您的描述,您似乎没有将此视为问题。
      • 您将浪费空间来存储不必存在的数据。换句话说,每行都使用五个数字的空间,而不管它们实际有什么,尽管这种影响可能很小(例如,如果它们是 varchar 并且可以为空)。
      • 您查找电话号码的查询会很复杂,因为您必须检查五个不同的列。我不知道这是否是您的用例之一,因此可能无关紧要。

      您可能应该选择一种或另一种方式(我不确定这是否是您的意图)。如果我遇到在 store 表和单独的电话号码表中都有电话号码的模式,我会特别生气,尤其是如果他们彼此不同意。即使我去规范化,我也倾向于使用插入/更新触发器来确保保持数据一致性。

      【讨论】:

      • 也许我得坐下来重新考虑一下整个商店电话的情况。最后,将所有电话放在一张桌子上而不是两到四张桌子上会好得多。我讨厌所有的SELECT data1, data2.... 让我觉得很脏。谢谢帕克斯。
      • 我还要补充一点,在许多情况下,需要“修复”的“性能”问题实际上是数据模型的概念问题。如果模型正确,98% 的时间 3NF 会提供最佳性能。
      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多