2010-09-06 69 views
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字段,因为它可能是一个巨大的痛苦。那么,你有什么看法。

回答

7

我认为,值得一提的是,如果您确实存在性能问题,那么您可以通过取消规范化来获得性能,而如果只有则只有。我总是为3NF设计,只有在绝对必要时才会恢复。

这不是你做你的查询看起来更好。任何体面的数据库开发人员都不会害怕一个适度复杂的SQL语句,尽管我不得不承认我已经看到了一些让我不寒而栗的多行语句 - 请注意,这些来自无法控制架构的客户: DBA首先会重新设计架构以避免这种怪异现象。

但是,只要您对解规范所带来的限制感到满意,就可以做任何您想要的。这并不是因为如果有3NF警察漫游地球寻找违法:-)

立即限制(可能还有其他),我可以看到的带是:

  • 你会被限制(最初,没有模式更改)到每个位置的五个电话号码。从你的描述看,你不会觉得这是一个问题。
  • 您将浪费存储不必在那里的数据。换句话说,每行都使用5个数字的空格,而不管它们实际拥有的是什么,尽管这种影响可能是最小的(例如,如果它们是varchar和nullable的话)。
  • 查询电话号码的查询会很复杂,因为您必须检查五个不同的列。不管那是你的一个用例,我不知道,所以它可能是不相关的。

你应该可能选择一种方式或其他(虽然我不确定这是你的意图)。如果我遇到一个在商店表和单独的电话号码表中有电话号码的架构,如果他们彼此不同意,则会特别恼火,如果他们不同意的话,那么尤其是。即使当我去规范化,我倾向于使用插入/更新触发器来确保数据一致性得以维持。

+1

+1强调数据库设计的一致性 – 2010-09-06 01:02:52

+1

也许我必须坐下来重新考虑整个手机的情况。把所有的手机都放在一张桌子里,而不是两张或四张,最后好多了。而男人我讨厌所有'SELECT data1,data2 ....'让我觉得很肮脏。谢谢Pax。 – Ben 2010-09-06 01:09:45

+0

如果我可以多次投票... – 2010-09-06 01:16:52

0

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

相关与老位置表的新表将帮助您超越获得电话号码

4

我想从一个错误的模型,您的问题造成的。

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

只需通过StoreId关键一切,您的问题就会消失。

+0

是的,一个商店可以有多个位置,并且电话与位置相关,因此位置ID(用于电话)。 – Ben 2010-09-06 01:43:19

+1

在这种情况下,保持正确的标准化模型,并做三/四表加入!它只是更多的编码,只要按键索引,它不会花费任何东西。 – 2010-09-06 07:25:21