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

Mic*_*ler 12 database-design data-modeling

可能的重复:
世界上所有地址都有共同的街道地址数据库设计吗?
在数据库中存储国际地址的"最佳"方式是什么?
在数据库中实现一致且全面的地址存储的最佳实践

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

每个表都有以下字段: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创建AddressTypes表
  4. 使用字段CustomerID,AddressID,AddressTypeID,CustomerAddressActive,LastUpdateUser,LastUpdateTime创建CustomerAddresses表
  5. 使用ClientID,AddressID,AddressTypeID,ClientAddressActive,LastUpdateUser,LastUpdateTime字段创建ClientAddresses表
  6. 使用字段ContactID,AddressID,AddressTypeID,ContactAddressActive,LastUpdateUser,LastUpdateTime创建ContactAddresses表
  7. 创建FacilityAddresses表,其中包含FacilityID,AddressID,AddressTypeID,FacilityAddressActive,LastUpdateUser,LastUpdateTime字段

我正在寻找指导,以确定是否有比我设计的解决方案更好的解决方案.大家为什么这么想?

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

Edw*_*son 11

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

  1. 从客户,联系人,设施和客户中删除AddressLine1,AddressLine2,City,StateOrProvince,PostalCode.
  2. 使用字段AddressTypeID,AddressTypeName,AddressTypeDescription,AddressTypeActive,LastUpdateUser,LastUpdateTime创建AddressTypes表
  3. 使用字段AddressID(PK),AddressTypeID(FK),AddressLine1,AddressLine2,City,StateOrProvince,PostalCode,LastUpdateUser,LastUpdateTime,CustomerID(FK),ClientID(FK),ContactID(FK),FacilityID(FK)创建地址表
  4. 在地址表中,设置了约束,使得只有客户ID,客户端ID,使用ContactID,或FacilityID一个外键可在同一时间非NULL.

这样,您可以在一个表中获得所有地址,它们可以引用您需要的任何记录,您的参照完整性是完整的,并且您没有必须遍历的中间表.

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

  • 客户*可以*拥有多个地址.Addresses表可以有多行引用相同的CustomerID.您不能使用相同的地址引用客户和联系人. (2认同)
  • 如果一个地址引用两个不同的客户,因为他们住在同一栋房子怎么办? (2认同)

归档时间:

查看次数:

15598 次

最近记录:

7 年,4 月 前