如何最好地表示数据库中的地址

时间:2009-09-18 15:59:57

标签: database-design data-modeling

  

可能重复:
  Is there common street addresses database design for all addresses of the world?
  What is the “best” way to store international addresses in a database?
  Best practices for consistent and comprehensive address storage in a database

我目前有四个表,即客户,联系人,设施和客户。

这些表中的每一个都有以下字段: AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。

我想将地址移到单独的表格中,并且还可以指定地址类型(计费,运费,主要等)。

我的解决方案如下:

  1. 从客户,联系人,设施和客户中删除AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。
  2. 使用字段AddressID(PK),AddressLine1,AddressLine2,City,StateOrProvince,PostalCode,LastUpdateUser,LastUpdateTime创建地址表。
  3. 使用字段AddressTypeID,AddressTypeName,AddressTypeDescription,AddressTypeActive,LastUpdateUser,LastUpdateTime
  4. 创建AddressTypes表
  5. 使用字段CustomerID,AddressID,AddressTypeID,CustomerAddressActive,LastUpdateUser,LastUpdateTime
  6. 创建CustomerAddresses表
  7. 使用ClientID,AddressID,AddressTypeID,ClientAddressActive,LastUpdateUser,LastUpdateTime
  8. 字段创建ClientAddresses表
  9. 使用字段ContactID,AddressID,AddressTypeID,ContactAddressActive,LastUpdateUser,LastUpdateTime
  10. 创建ContactAddresses表
  11. 使用字段FacilityID,AddressID,AddressTypeID,FacilityAddressActive,LastUpdateUser,LastUpdateTime
  12. 创建FacilityAddresses表

    我正在寻找指导,以确定是否有比我设计的解决方案更好的解决方案。为什么每个人都在想?

    编辑:此时我并不关心美国以外的任何事情,也不关心如何存储街道地址,即街道号码与整个街道地址。我担心数据库设计和表结构的立场。

4 个答案:

答案 0 :(得分:11)

我以前工作过的DBA告诉我这个宝石,它对我们来说很有用(前两个步骤与你的解决方案相同):

  1. 从客户,联系人,设施和客户中删除AddressLine1,AddressLine2,City,StateOrProvince,PostalCode。
  2. 使用字段AddressTypeID,AddressTypeName,AddressTypeDescription,AddressTypeActive,LastUpdateUser,LastUpdateTime
  3. 创建AddressTypes表
  4. 使用字段AddressID(PK),AddressTypeID(FK),AddressLine1,AddressLine2,City,StateOrProvince,PostalCode,LastUpdateUser,LastUpdateTime,CustomerID(FK),ClientID(FK),ContactID(FK),FacilityID(FK)创建地址表)
  5. 在地址表上,设置一个约束,以便一次只有一个CustomerID,ClientID,ContactID或FacilityID外键可能为非NULL。
  6. 通过这种方式,您可以在一个表中获得所有地址,它们可以引用您需要的任何记录,您的参照完整性是完整的,并且您没有必须遍历的中间表。

    缺点是,如果要将地址添加到新的对象类(例如Employee表),则必须将“EmployeeID”列添加到“地址”表中,但这非常简单。

答案 1 :(得分:2)

我们在数据库中你可能想要考虑的另一件事是在地址表上有一个通信标志,触发器强制每人只有一个地址可以作为对应关系。我们向数据库中的人发送了大量邮件,并且知道在发送邮件时我们需要使用的三个地址中的哪一个是非常宝贵的。当查询每人只抓一个地址时,它也更容易,以避免为某些报告获得每人多个记录。

答案 2 :(得分:0)

我还想添加一件事,为了简单起见,创建将地址信息扩展到表格的视图,或者你可能讨厌以这种方式设计db。

答案 3 :(得分:0)

我会考虑使用

的单个AddressLink(名称?)表
LinkTypeID (Customer,Client,Contact,Facility) -- needs additional TypeID table
ID (CustomerID,ClientID...)
AddressID
AddressTypeID
AddressActive
LastUpdateUser
LastUpdateTime

添加新的地址链接类型意味着添加新的LinkTypeID w / o新的[TypeID]地址表,不需要修改任何查询,如果您正在寻找地址的所有用途(对于删除等),那么只有一个地方看。

无论如何,这与我们这样做非常相似。

哦,我们的地址(等效)表中有一个AddressLine3用于一些奇怪的异常情况。