在这种情况下,非规范化是否可接受?

时间:2010-09-06 00:40:43

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

我有以下locations表:

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

phones表:

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

现在,请记住,对于任何捐赠商店,它最多可以包含五个电话号码。订单无关紧要。

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

现在,这个新表格不适用于locationID,因此我们无法将手机存储在上一个手机信息中。

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

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

共有2个表和2个连接。

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

3 个答案:

答案 0 :(得分:7)

我认为,对于它的价值而言,如果您实际上遇到性能问题,那么取消规范化就是为了获得性能而做的事情,而。我总是为3NF设计,只有在绝对必要时才会恢复。

这不是为了让您的查询看起来更好而做的事情。任何体面的数据库开发人员都不会担心中等复杂的SQL语句,尽管我不得不承认我已经看到一些让我感到颤抖的数百行语句 - 请注意,这些语句来自无法控制模式的客户: DBA首先会重新设计架构以避免这种怪异。

但是,只要你对非规范化带来的限制感到满意,你就可以做任何你想做的事情。这并不是说有一群3NF警察漫游这个星球寻找违规者: - )

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

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

你应该选择这样或那样的方式(我不确定这是不是你的意图)。如果我在商店桌子和单独的电话号码表中遇到电话号码的架构,我会特别恼火,如果他们彼此不同意,特别是。即使我取消规范化,我也倾向于使用插入/更新触发器来确保数据的一致性。

答案 1 :(得分:4)

我认为你的问题源于一个错误的模型。

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

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

答案 2 :(得分:0)

只是尝试将您的新表与旧位置表相关联,因为这两个表都代表了您应该能够找到的商店以便将它们联系起来。如果你能做到这一点你的问题就解决了,因为你可以像以前一样继续使用电话表。

相关新表与旧位置表将帮助您获取电话号码