我有以下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
字段,因为这可能是一个巨大的痛苦。那么,你的意见是什么。
答案 0 :(得分:7)
我认为,对于它的价值而言,如果您实际上遇到性能问题,那么取消规范化就是为了获得性能而做的事情,而仅。我总是为3NF设计,只有在绝对必要时才会恢复。
这不是为了让您的查询看起来更好而做的事情。任何体面的数据库开发人员都不会担心中等复杂的SQL语句,尽管我不得不承认我已经看到一些让我感到颤抖的数百行语句 - 请注意,这些语句来自无法控制模式的客户: DBA首先会重新设计架构以避免这种怪异。
但是,只要你对非规范化带来的限制感到满意,你就可以做任何你想做的事情。这并不是说有一群3NF警察漫游这个星球寻找违规者: - )
我可以看到的直接限制(可能还有其他限制)是:
你应该选择这样或那样的方式(我不确定这是不是你的意图)。如果我在商店桌子和单独的电话号码表中遇到电话号码的架构,我会特别恼火,如果他们彼此不同意,特别是。即使我取消规范化,我也倾向于使用插入/更新触发器来确保数据的一致性。
答案 1 :(得分:4)
我认为你的问题源于一个错误的模型。
为什么你有位置ID和商店ID?商店可以占据多个地点吗? 电话号码是否与地理位置相关联?
只需通过StoreId键入所有内容,您的问题就会消失。
答案 2 :(得分:0)
只是尝试将您的新表与旧位置表相关联,因为这两个表都代表了您应该能够找到的商店以便将它们联系起来。如果你能做到这一点你的问题就解决了,因为你可以像以前一样继续使用电话表。
相关新表与旧位置表将帮助您获取电话号码