问题 如何最好地表示数据库中的地址[重复]


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

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

每个表都包含以下字段: 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. 使用字段FacilityID,AddressID,AddressTypeID,FacilityAddressActive,LastUpdateUser,LastUpdateTime创建FacilityAddresses表

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

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


6028
2017-09-18 15:59


起源

看到: stackoverflow.com/questions/24481  stackoverflow.com/questions/126207  stackoverflow.com/questions/929684  stackoverflow.com/questions/310540 等等 - Welbog
有多个地址表有什么问题? - NoChance


答案:


我以前工作过的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.在地址表中,设置约束,以便一次只有一个CustomerID,ClientID,ContactID或FacilityID外键可能为非NULL。

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

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


9
2017-09-18 16:50



添加如此多的主键有什么意义,反向可以使生活更轻松,并允许客户(只是一个样本)可以拥有多个地址的关系。 - Cem Kalyoncu
客户 能够 有多个地址。 Addresses表可以有多个引用同一CustomerID的行。您不能使用相同的地址引用客户和联系人。 - Edward Robertson
如果一个地址引用两个不同的客户,因为他们住在同一栋房子怎么办? - nonsensecreativity
@nonsensecreativity,你可以有两个地址具有相同的AddressLine1,City,StateOProvince,PostalCode - danilo


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


2
2017-09-18 17:06





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


0
2017-09-18 16:10





我考虑使用单个AddressLink(名称?)表

LinkTypeID (Customer,Client,Contact,Facility) -- needs additional TypeID table
ID (CustomerID,ClientID...)
AddressID
AddressTypeID
AddressActive
LastUpdateUser
LastUpdateTime

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

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

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


0
2017-09-18 16:23



如何使用此结构对ID强制执行外键约束?或者你不打扰? - APC
插入/修改触发器验证ID列相对于LinkTypeID是否有效。 LinkTypeID,AddressID和AddressTypeID列上的FK,以及父表上的“删除限制”。一世 认为 这是以声明方式完成的,但也可能是触发器。 (MS SQL Server 2005) - DaveE