可能重复:
世界上所有地址都有共同的街道地址数据库设计吗?
在数据库中存储国际地址的“最佳”方式是什么?
在数据库中实现一致且全面的地址存储的最佳实践
我目前有四个表,客户,联系人,设施和客户。
每个表都包含以下字段:
AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。
我想将地址移到一个单独的表格中,并且还能够指定地址类型(计费,运输,主要等)。
我的解决方案如下:
- 从客户,联系人,设施和客户中删除AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。
- 创建地址表,其中包含AddressID(PK),AddressLine1,AddressLine2,City,StateOrProvince,PostalCode,LastUpdateUser,LastUpdateTime字段。
- 使用字段AddressTypeID,AddressTypeName,AddressTypeDescription,AddressTypeActive,LastUpdateUser,LastUpdateTime创建AddressTypes表
- 使用字段CustomerID,AddressID,AddressTypeID,CustomerAddressActive,LastUpdateUser,LastUpdateTime创建CustomerAddresses表
- 使用ClientID,AddressID,AddressTypeID,ClientAddressActive,LastUpdateUser,LastUpdateTime字段创建ClientAddresses表
- 使用字段ContactID,AddressID,AddressTypeID,ContactAddressActive,LastUpdateUser,LastUpdateTime创建ContactAddresses表
- 使用字段FacilityID,AddressID,AddressTypeID,FacilityAddressActive,LastUpdateUser,LastUpdateTime创建FacilityAddresses表
我正在寻找指导,以确定是否有比我设计的解决方案更好的解决方案。大家为什么这么想?
编辑:此时我并不关心美国以外的任何事情,也不关心如何存储街道地址,即街道号码与整个街道地址。我担心数据库设计和表结构的立场。
我以前工作过的DBA告诉我这个宝石,它对我们很有用(前两个步骤与你的解决方案相同):
- 从客户,联系人,设施和客户端删除AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。
- 使用字段AddressTypeID,AddressTypeName,AddressTypeDescription,AddressTypeActive,LastUpdateUser,LastUpdateTime创建AddressTypes表
- 使用字段AddressID(PK),AddressTypeID(FK),AddressLine1,AddressLine2,City,StateOrProvince,PostalCode,LastUpdateUser,LastUpdateTime,CustomerID(FK),ClientID(FK),ContactID(FK),FacilityID(FK)创建地址表
4.在地址表中,设置约束,以便一次只有一个CustomerID,ClientID,ContactID或FacilityID外键可能为非NULL。
这样,您可以在一个表中获得所有地址,它们可以引用您需要的任何记录,您的参照完整性是完整的,并且您没有必须遍历的中间表。
缺点是,如果要将地址添加到新的对象类(例如Employee表),则必须在Addresses表中添加EmployeeID列,但这非常简单。
我们在数据库中你可能想要考虑的另一件事是在地址表上有一个通信标志,触发器强制每人只有一个地址可以作为对应关系。我们向我们数据库中的人发送了大量邮件,并且知道在发送邮件时我们需要使用的三个地址中的哪一个是非常宝贵的。当查询每人只抓一个地址时,它也更容易,以避免每个人获得一些报告的多个记录。
我还想添加一件事,为了简单起见,创建将地址信息扩展到表格的视图,或者您可能讨厌以这种方式设计db。
我考虑使用单个AddressLink(名称?)表
LinkTypeID (Customer,Client,Contact,Facility) -- needs additional TypeID table
ID (CustomerID,ClientID...)
AddressID
AddressTypeID
AddressActive
LastUpdateUser
LastUpdateTime
添加新的地址链接类型意味着添加新的LinkTypeID w / o新的[TypeID]地址表,不需要修改任何查询,如果您正在寻找地址的所有使用(对于删除等),那么只有一个地方可以看。
无论如何,这与我们如何做到非常相似。
哦,我们在地址(等效)表中有一个AddressLine3用于一些奇怪的异常情况。