Der*_*rek 0 database-design sql-server-2005
我认为这是常见的事情......你有一个数据库服务器,并且你想在其中存储客户联系信息.
你需要这个人的姓名,地址,电话等.
存储地址和电话的最佳做法是什么?假设OLTP ......
多人可能拥有相同的电话号码(例如妻子和丈夫,或母亲和女儿).
多人共用一个家庭.
我读了这篇:http://sqlcat.com/sqlcat/b/whitepapers/archive/2008/09/03/best-practices-for-semantic-data-modeling-for-performance-and-scalability.aspx
对于所提到的特定模型,这将工作正常,但我不知道如何优化此模型,而不是非规范化.
例如:
因此,如果我像白皮书那样设计它,我会personid
在我的address
桌子和phone
桌子上有一个.但是,由于多人可能共享同一地址,因此这是不可行的.一个人可能有多个地址甚至没有地址.所以我似乎需要一个人 - >地址映射表以及手机的映射表,否则我会对这两个表进行非规范化,并且在两个共享相同的人的不寻常情况下会有一些重复电话/地址.
无论如何,我提出这个问题的观点是因为看起来很难找到这种类型的"最佳实践",但它似乎就是任何类型的应用程序或数据库中出现的类型.
将地址和电话号码标准化为一对多关系,其中Contact
可能有许多相关Phone
或Address
实体,这是完全合理的.
但是,没有必要在联系人数据库中以多对多关系规范化地址和电话号码,因为这些不是您有兴趣单独使用的实体,它们本身就是唯一实体.事实上,我会说在你的情况下,将它们标准化到那个水平并不是一个好的设计.
如果您在房地产,租赁或电话服务中建立业务模型,即使没有人与之关联,您也可以关注房产和电话号码,那么将它们建模到这个级别是有意义的.在多对多设计中避免重复地址和电话号码比让他们再次输入地址更有效,并且避免这些重复没有真正的好处.另外,无论如何,你最终会得到重复项(至少对于地址,除非你使用邮局例程实时擦除它们),所以谁将要经历并匹配'123 Ascot Wy#5'到'123 Ascot Way Apt 5'?那有什么价值?
将这种深度归一化的通常原因并不适用.假设您确实创建了一个PhoneNumber
表和PersonPhoneNumber
多对多关系所需的表.您有三个人使用相同的电话号码,他们都正确链接到它.现在,他们中的一个打电话给你,告诉你他正在改变他的电话号码.您确定要更改实际PhoneNumber
记录并同时更新其他两个人的号码吗?如果他们不和他一起移动怎么办?很快你会发现你的数据搞砸了.您也可以将FirstName
表中的名字和表格的姓氏标准化LastName
!然后当"Joey"长大并将其名字改为"Joe"时,所有其他Joeys将获得自动升级.但是哎呀......"乔"已经存在了,就像你正在改变上面三个人中的一个人的电话号码那样......真是一团糟.
另外,你会PhoneID
用作电话号码的代理键吗?但是电话号码是实际上作为自然键的好东西之一,它们几乎甚至要求被用作自然键.然后您的Phone
表变得毫无意义,因为它不会编码有关该电话号码的任何其他信息.它只是一个电话号码列表,它已经存在于引用表中.不要使用这样的Phone
表.如果您想知道两个人是否共用同一个电话号码,您只需加入或按列分组即可!在我看来,它会接近愚蠢,有一个抽象层,其中电话号码与单调递增相关联PhoneID
.
如果您阅读通用人员和组织模型,您将看到电话号码和地址实际上不是需要建模到多对多关系级别的实体的视角 - 它们更像是"智能定位器"将邮件路由到收件人.为什么你会迫使三个不同的人的定位器(又名电话号码)相同?定位器有助于找到人,而不是发出响铃的物理电话.你不会在乎电话或者其他人可能会回答的问题 - 你只关心这样一个事实,即一旦回答,可能会联系到感兴趣的人.
归档时间: |
|
查看次数: |
2715 次 |
最近记录: |