13

可能的重复:
是否有适用于世界所有地址的通用街道地址数据库设计?
在数据库中存储国际地址的“最佳”方式是什么?
数据库中一致且全面的地址存储的最佳实践

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

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

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

我的解决方案如下:

  1. 从客户、联系人、设施和客户中删除 AddressLine1、AddressLine2、City、StateOrProvince、PostalCode。
  2. 创建包含字段 AddressID(PK)、AddressLine1、AddressLine2、City、StateOrProvince、PostalCode、LastUpdateUser、LastUpdateTime 的 Addresses 表。
  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 表

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

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

4

4 回答 4

13

我曾经工作过的 DBA 告诉我这个 gem,它对我们非常有用(前两个步骤与您的解决方案中的相同):

  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) 的 Addresses 表
  4. 在addresses 表上,设置一个约束,以便一次只能有一个CustomerID、ClientID、ContactID 或FacilityID 外键为非NULL。

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

不利的一面是,如果您想将地址添加到新的对象类(例如 Employee 表),您必须将 EmployeeID 列添加到 Addresses 表,但这很容易。

于 2009-09-18T16:50:52.727 回答
2

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

于 2009-09-18T17:06:01.427 回答
0

我会考虑一个 AddressLink (名称?)表

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

添加新的地址链接类型意味着添加新的 LinkTypeID 没有新的 [TypeID]Addresses 表,无需修改查询,如果您正在寻找地址的所有用途(用于删除等),只有一个地方可以看。

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

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

于 2009-09-18T16:23:19.390 回答
0

我还想添加一件事,为了简单起见,创建将地址信息扩展到表的视图,否则您可能会讨厌自己以这种方式设计数据库。

于 2009-09-18T16:10:48.840 回答