地址簿数据库架构

pal*_*sey 2 schema microformats normalizing vcf-vcard hcard

我需要为用户存储联系信息.我希望将此数据作为hCard显示在页面上,并可作为vCard下载.我也希望能够通过电话号码,电子邮件等搜索数据库.

您认为存储此数据的最佳方式是什么?由于用户可能有多个地址等,因此完全规范化将是一团糟.我正在考虑使用XML,但我不熟悉查询XML数据库字段.我仍然可以通过联系信息搜索用户吗?

我正在使用SQL Server 2005,如果这很重要的话.

Ala*_*lan 7

考虑两个People及其地址表:

People (pid, prefix, firstName, lastName, suffix, DOB, ... primaryAddressTag )

AddressBook (pid, tag, address1, address2, city, stateProv, postalCode, ... )
Run Code Online (Sandbox Code Playgroud)

People的主键(唯一标识每一行)是pid.AddressBook的PK是pid和tag的组合(pid, tag).

一些示例数据:

1, Kirk

2, Spock
Run Code Online (Sandbox Code Playgroud)

地址簿

1, home, '123 Main Street', Iowa

1, work, 'USS Enterprise NCC-1701'

2, other, 'Mt. Selaya, Vulcan'
Run Code Online (Sandbox Code Playgroud)

在这个例子中,Kirk有两个地址:一个是"家",一个是"工作".其中一个可以(并且应该)People在primaryAddressTag列中注明为外键(如交叉引用).

Spock有一个带有'other'标签的地址.由于这是Spock唯一的地址,因此值'other'应该在primaryAddressTagpid = 2 的列中.

这种模式具有很好的效果,可以防止同一个人通过意外重用标签来复制他们自己的任何地址,同时允许所有其他人使用他们喜欢的任何地址标签.

此外,通过FK引用primaryAddressTag,数据库系统本身将强制主要地址标记的有效性(通过我们数据库极客称之为引用完整性的东西),以便您或任何应用程序不必担心它.