0

我有下locations表:

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

phones表格:

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

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

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

现在,这个新表没有应用 locationID,所以我们不能将电话存储在以前的电话表中。

最后,保持数据库规范化需要 2 个新表和总共 4 个连接来检索数据。对其进行非规范化会使旧表如下所示:

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

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

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

4

3 回答 3

7

我的观点是,当且仅当您确实遇到性能问题时,反规范化是您为了获得性能而做的事情。我总是为 3NF 设计,只有在绝对必要时才恢复。

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

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

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

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

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

于 2010-09-06T00:56:36.863 回答
4

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

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

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

于 2010-09-06T01:28:04.427 回答
0

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

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

于 2010-09-06T01:13:29.243 回答