我需要为用户存储联系信息.我希望将此数据作为hCard显示在页面上,并可作为vCard下载.我也希望能够通过电话号码,电子邮件等搜索数据库.
您认为存储此数据的最佳方式是什么?由于用户可能有多个地址等,因此完全规范化将是一团糟.我正在考虑使用XML,但我不熟悉查询XML数据库字段.我仍然可以通过联系信息搜索用户吗?
我正在使用SQL Server 2005,如果这很重要的话.
考虑两个People及其地址表:
People (pid, prefix, firstName, lastName, suffix, DOB, ... primaryAddressTag ) AddressBook (pid, tag, address1, address2, city, stateProv, postalCode, ... )
People的主键(唯一标识每一行)是pid
.AddressBook的PK是pid和tag的组合(pid, tag)
.
一些示例数据:
1, Kirk 2, Spock
1, home, '123 Main Street', Iowa 1, work, 'USS Enterprise NCC-1701' 2, other, 'Mt. Selaya, Vulcan'
在这个例子中,Kirk有两个地址:一个是"家",一个是"工作".其中一个可以(并且应该)People
在primaryAddressTag列中注明为外键(如交叉引用).
Spock有一个带有'other'标签的地址.由于这是Spock唯一的地址,因此值'other'应该在primaryAddressTag
pid = 2 的列中.
这种模式具有很好的效果,可以防止同一个人通过意外重用标签来复制他们自己的任何地址,同时允许所有其他人使用他们喜欢的任何地址标签.
此外,通过FK引用primaryAddressTag
,数据库系统本身将强制主要地址标记的有效性(通过我们数据库极客称之为引用完整性的东西),以便您或任何应用程序不必担心它.