Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 如何以规范化的方式存储联系人方法(或具有不同字段的类似类型数据)?_Sql_Sql Server_Database_Database Design_Normalization - Fatal编程技术网

Sql 如何以规范化的方式存储联系人方法(或具有不同字段的类似类型数据)?

Sql 如何以规范化的方式存储联系人方法(或具有不同字段的类似类型数据)?,sql,sql-server,database,database-design,normalization,Sql,Sql Server,Database,Database Design,Normalization,我在我写的每一份申请中都遇到过这个问题。我想要一个最终的一致答案 这是在数据库中存储联系人方法或此模式下的任何其他数据的最规范化/高效/正确的方法吗 Contact { PK ContactId, ... } ContactContactMethod {PK FK ContactId, PK FK ContactMethodId, Key, Comments } AddressContactMethod {PK FK ContactMethodId, Line1, Line2, City,

我在我写的每一份申请中都遇到过这个问题。我想要一个最终的一致答案

这是在数据库中存储联系人方法或此模式下的任何其他数据的最规范化/高效/正确的方法吗

Contact { PK ContactId, ... }

ContactContactMethod {PK FK ContactId, PK FK ContactMethodId, Key, Comments }

AddressContactMethod {PK FK ContactMethodId, Line1, Line2, City, State, Zip }
EmailContactMethod {PK FK ContactMethodId, EmailAddress }
InstantMessengerContactMethod {PK FK ContactMethodId, IMClient, IMAddress }
PhoneContactMethod {PK FK ContactMethodId, ... }
WebsiteContactMethod {PK FK ContactMethodId, ... }
OtherContactMethod {PK FK ContactMethodId, ... }

我应该在 CONTACTACTACTIOMENT < /COS>表中考虑<代码> CONTACTMEDATABASE < /C> >的XML字段吗?< /P> AddressContactMethod、EmailContactMethod等都共享相同的主键唯一性,这让人感觉有些不对劲

还考虑了联系人数据的键、值对,但这比Xml字段更难查询


(设计指南:每种联系人可能有不止一种或没有任何一种联系方式,每种联系方式都有一个非唯一的“键”,如“家、工作、红色汽车等”和注释,但不同类型之间没有其他共享数据元素)

大多数人确实对设计感兴趣。从这个角度来看,你真正关心某个联系人的电话号码是多少?通常为1;有时2

地址也是一样,通常您真正需要的只是文件中的地址

所以,记住这一点,看看你的应用程序。如果你真的只有2个电话号码,请将它们存储在联系人表中,如家庭电话、工作电话或其他任何形式。如果在将来的某个时候,你确定你需要更多的电话号码,那就继续吧,把这些号码分成一张单独的表格。地址也一样。电子邮件也一样

事实上,大多数用户界面并不在网格中显示电话号码。取而代之的是,它们被放置在与人的名字对齐的位置。原因是你只需要几个数字


总而言之:让数据库尽可能简单。UI团队和您的数据库服务器将为此感谢您。

在过去,我会使用表模式,例如:

Person [ID, Name]
ContactPoint [ID, PersonID, ContactMethod]
EmailContactPoint [ID, EmailAddress]
AddressContactPoint [ID, Line1, Line2, blah]
在不同的接触点和接触点表之间具有1-1关系-一种继承。ORM的Hibernate/NHibernate和Entity Framework可以基于这些1-1关系实例化正确的类型


现在,我可能只使用一个XML blob和SQL中的两个函数,以便轻松处理特定类型(例如“GetPrimaryPhoneNumber(personID))的默认/主要联系人

最终的共识答案是,每个人自己的答案都是最好的,其他人的答案一文不值。这就是问题所在;没有一种方法可以满足每个人的需要。因此,可能永远不会有最终的共识答案-可能甚至不会有共识的答案,但几乎肯定不会有最终的答案。

像你一样,我看到过很多我认为你的设计是相当合理的,将键列与*方法表分开定位是一种很好的方法,允许以某种方式对“家庭”电子邮件和邮政地址进行分组

然而,我认为大多数联系人数据库的结构过于复杂。虽然我不同意Chris Lively的方法,但我认为您可以通过提供联系人信息(电子邮件、电话、web url等)来简化并为每个类型存储一个简单的文本字符串。尝试验证单独的类型或将其拆分为子字段通常不值得。首先,如果您允许美国以外的联系人,则所有电话和地址验证规则都会立即退出窗口。将完整地址存储在Unicode字符串中,并希望一切顺利这是我的建议

这就留下了这样的设计:

Contact { PK ContactId, ... }
ContactType { PK ContactTypeId, ContactType }
ContactMethod {PK FK ContactId, PK FK ContactTypeId, PK Key, Value, Comments }
ContactMethod.Value是文本值


这似乎与谷歌追踪联系人的方式非常相似。如果没有其他问题的话,他们可能已经仔细考虑了跟踪地球上每个国家数以百万计的联系人的问题。

这种模式有一个名字。它被称为“专业化-泛化”

在这种情况下,联系方式是联系联系人的特殊方式


在web上搜索“泛化-专业化-关系设计”将引导您找到一些以更通用的方式处理此模式的文章。对于相同模式的面向对象视图,请搜索“泛化-专业化-对象设计”.

我对此很感兴趣。虽然看起来你的设计很不错,但它涵盖了我从你的设计指南中想到的所有情况。我同意你关于XML和键/值数据的评论-这些开始破坏数据库的用途。只是好奇-为什么你在所有地址/电子邮件/等表格上都有PK FK ContactMethodIdes?是否会有一个基本的ContactMethod表,他们都绑定到该表,或者他们可以自己站起来?@Andy他们绑定到ContactMethod表,我明白了,该表可能是分配标识的表。ContactMethod只是提供“键”和“注释”的表对于每一种关系。我想这可能更好,因为在Contact和ContactMethod之间进行多对多联系是没有意义的。谢谢我知道这个话题很老,但我有一个关于ContactMethodId的问题。如果地址、电子邮件等中是FK并指向ContactMethod,那么FK在哪里联系我Thody in ContactMethod指向?你如何从Id判断Id是否是地址、电子邮件、网站等?@Chris我同意你提出的每一点,但是,在这种情况下,我们的UI将为每种类型的联系方式支持多个输入,不会像网格一样让用户感到困惑。这一点对我们也很重要我们允许他们标记任何他们想要的东西,而不是固定在家里,Work@yukondude这是我的第一种方法,但当客户x要求提供一份按邮政编码显示其联系人所在地的地理报告时会发生什么?或者为了营销目的提取电子邮件时会发生什么?感觉就像我在欺骗数据库索引。我支持