Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在SQLServer2005中设计联系人数据库_Sql Server 2005_Database Design - Fatal编程技术网

Sql server 2005 在SQLServer2005中设计联系人数据库

Sql server 2005 在SQLServer2005中设计联系人数据库,sql-server-2005,database-design,Sql Server 2005,Database Design,我认为这是一件很平常的事。。。您有一个数据库服务器,并且希望在其中存储客户联系信息 你需要对方的姓名、地址、电话等 存储地址和电话的最佳做法是什么?假设OLTP 多个人可能有相同的电话号码,如妻子和丈夫,或母亲和女儿 多人共享一个家庭 我读到: 对于上面提到的特定模型来说,这很好,但是我不知道这个模型如何在没有去规范化的情况下得到优化 例: 人员表=人员id、姓名、姓氏等。。。 地址表=地址id、地址行1等。。 电话表=电话id、电话号码等。。。 所以,如果我像白皮书建议的那样设计它,我的地址表

我认为这是一件很平常的事。。。您有一个数据库服务器,并且希望在其中存储客户联系信息

你需要对方的姓名、地址、电话等

存储地址和电话的最佳做法是什么?假设OLTP

多个人可能有相同的电话号码,如妻子和丈夫,或母亲和女儿

多人共享一个家庭

我读到:

对于上面提到的特定模型来说,这很好,但是我不知道这个模型如何在没有去规范化的情况下得到优化

例:

人员表=人员id、姓名、姓氏等。。。 地址表=地址id、地址行1等。。 电话表=电话id、电话号码等。。。 所以,如果我像白皮书建议的那样设计它,我的地址表和电话表中都会有一个personid。然而,由于多人可能共享同一地址,这是不可行的。一个人可能有多个地址,甚至没有地址。因此,我似乎需要一个person->address映射表以及一个电话映射表,否则我将对这两个表进行反规范化,并在两个人共享同一电话/地址的不寻常情况下允许出现一些重复

无论如何,我问这个问题的目的是因为似乎很难找到这种类型的“最佳实践”,但它似乎是任何类型的应用程序或数据库中都会出现的类型。

规范化

恢复正常直到疼痛

再次恢复正常,直到痛苦不堪

然后调整您的查询;设计你的索引;衡量你的表现;如果此时您没有其他选项,请将最小值反规范化以满足性能选项

请记住,每一个加速一个查询性能的非规范化本质上都会降低tat表集上几乎所有操作的性能。只有当测量结果确实显示出明显的性能改进时,才保持非规范化


记住,标准化越多,索引越小;缓存中的索引行越多,数据库执行的速度就越快。是的,创建了很多非常小的表-它们永久地在缓存中,因此几乎可以自由访问。

在一对多关系中规范化地址和电话号码,其中联系人可能有许多相关的电话或地址实体,这是非常有意义的

但是,没有必要在联系人数据库中对多对多关系中的地址和电话号码进行规范化,因为这些实体本身并不是您感兴趣的实体,它们是唯一的实体。事实上,我想说,在您的情况下,将它们规范化到那个级别并不是一个好的设计

如果你是在房地产、租赁或电话服务行业建模,即使没有人与你联系,你也会关心房地产和电话号码,那么将他们建模到这个水平是有意义的。对于某些人来说,在多对多设计中避免重复的地址和电话号码要比他们只需再次输入地址做更多的工作,避免这些重复并没有真正的好处。另外,除非你使用邮局的例行程序实时清除所有地址,否则你至少会得到地址的副本,那么谁会通过“123 Ascot Wy 5”匹配到“123 Ascot Way Apt 5”?这有什么价值

正常化这一深度的通常理由并不适用。假设您确实创建了多对多关系所需的PhoneNumber表和PersonPhoneNumber表。你有三个人使用同一个电话号码,他们都正确地连接到该号码。现在,他们中的一个打电话给你,告诉你他正在改变他的电话号码。您确定要更改实际电话号码记录并同时更新其他两个人的电话号码吗?如果他们不和他一起搬家怎么办?很快你就会发现你的数据被弄糟了。您还可以将名字规范化为FirstName表,将姓氏规范化为LastName表!然后,当乔伊长大并改名为乔时,所有其他乔伊都会自动升级。但是哎呀。。。乔已经存在了,你要把上面三个人中的一个换成的电话号码也已经存在了。。。真是一团糟

另一件事,你会使用PhoneID作为电话号码的代理键吗?但电话号码是少数几个真正可以作为自然钥匙使用的东西之一,它们甚至要求被用作自然钥匙。然后你的电话表就变得毫无意义了,因为它没有编码关于那个电话号码的任何附加信息。它只是一个电话号码列表,已经存在于参考表中。不要用那种电话桌。如果你想知道两个人是否共用同一个电话号码, 您只需按列加入或分组即可!在我看来,把一个电话号码和一个单调递增的音素联系起来的抽象层近乎愚蠢


如果你阅读了这篇文章,你会发现电话号码和地址实际上不是需要建模到多对多关系级别的实体,它们更像是将消息路由到收件人的智能定位器。你到底为什么要强迫三个不同的人的定位器a.k.a.电话号码相同?定位器帮助定位人,而不是响的物理电话。你不可能不关心电话或其他人的回答。你只关心一个事实,即一旦回答,就有可能联系到感兴趣的人。

大多数联系人数据库不会努力在多人之间共享一个地址或电话号码。对于用户来说,输入这些复杂的相关数据需要做很多工作,不管怎样,通常如果两个人共享一个数字,您只需输入两次数字就可以了。我可以建议你阅读一些想法吗?我们都听过规范化直到伤痛,非规范化直到成功,但我认为这种没有上下文的真理对初学者来说不是很有用,特别是当说初学者提供了一个实际的用例/实际场景,他需要具体的建议时。读完我的答案后,你真的认为电话号码应该标准化到OP建议的水平吗?您真的认为Person表应该将FirstNameID和LastNameID作为名称表的FKs吗?这肯定会非常痛苦,而且几乎肯定是错误的。所以,伊姆霍,这不是个好建议。@ErikE:什么!?OP并没有提出任何类似的建议。你从哪里得到的。他建议规范化电话号码和地址,我在回答中把这比作规范化姓名。你说,正常化,直到它是痛苦的,我给了你一些痛苦的正常化的名字和姓氏,问你这是否真的有意义。我不是想说OP建议了这种程度的正常化,而是你暗示了!我不会投你一票。这将帮助我提高回答的质量,以应对任何有用的批评。谢谢,你有一些好主意。不需要在电话表中搜索特定的号码,因为我并不真正关心这些号码本身,只关心这些人以及他们分配给他们的号码。一张“个人电话”桌可能适合这张账单。至于地址,它们也有电话号码,在存储业务信息的情况下,可能不是一个人本身,而是一个业务实体和一个地址。该地址需要有一个相关的电话号码,但我认为没有必要将这些电话号码存储在与个人电话号码相同的位置。谢谢@ErikE我知道这是一个老问题/答案,但我想+1,因为经过深思熟虑的清晰、简洁和书面的答案。