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

Database design 如何最好地表示数据库中的地址,database-design,data-modeling,Database Design,Data Modeling,可能的重复项: 我目前有四张桌子、客户、联系人、设施和客户 每个表都有以下字段: 地址行1、地址行2、城市、州或省、邮政编码 我想把地址移到一个单独的表中,并且能够指定地址的类型(账单、发货、主地址等) 我的解决办法如下: 从客户、联系人、设施和客户中删除AddressLine1、AddressLine2、城市、州或省、邮政编码 创建包含以下字段的地址表:AddressID(PK)、AddressLine1、AddressLine2、城市、州或省、PostalCode、LastUpdate

可能的重复项:


我目前有四张桌子、客户、联系人、设施和客户

每个表都有以下字段: 地址行1、地址行2、城市、州或省、邮政编码

我想把地址移到一个单独的表中,并且能够指定地址的类型(账单、发货、主地址等)

我的解决办法如下:

  • 从客户、联系人、设施和客户中删除AddressLine1、AddressLine2、城市、州或省、邮政编码
  • 创建包含以下字段的地址表:AddressID(PK)、AddressLine1、AddressLine2、城市、州或省、PostalCode、LastUpdateUser、LastUpdateTime
  • 使用字段AddressTypeID、AddressTypeName、AddressTypeDescription、AddressTypeActive、LastUpdateUser、LastUpdateTime创建AddressTypes表
  • 创建CustomerAddresses表,其中包含CustomerID、AddressID、AddressTypeID、CustomerAddressActive、LastUpdateUser、LastUpdateTime字段
  • 使用ClientID、AddressID、AddressTypeID、ClientAddressActive、LastUpdateUser、LastUpdateTime字段创建ClientAddresses表
  • 创建ContactAddresses表,其中包含ContactID、AddressID、AddressTypeID、ContactAddressActive、LastUpdateUser、LastUpdateTime字段
  • 使用FacilityID、AddressID、AddressTypeID、FacilityAddressActive、LastUpdateUser、LastUpdateTime字段创建FacilityAddresses表
  • 我正在寻找指导,以确定是否有比我设计的更好的解决方案。为什么大家都这么想


    编辑:在这一点上,我不关心美国以外的任何事情,也不关心如何存储街道地址,即街道编号与整个街道地址。我关注数据库设计和表结构的观点。

    < P>我还想添加一件事,为了简单起见,创建将地址信息扩展到表中的视图,或者您可能讨厌这样设计DB。

    < P>我考虑一个带有< /P>的单地址链接(Name)表。
    LinkTypeID (Customer,Client,Contact,Facility) -- needs additional TypeID table
    ID (CustomerID,ClientID...)
    AddressID
    AddressTypeID
    AddressActive
    LastUpdateUser
    LastUpdateTime
    
    添加一个新地址链接类型意味着添加一个新的LinkTypeID,而不使用新的[TypeID]地址表,无需修改查询,如果您要查找地址的所有用途(用于删除等),则只需查找一个位置

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


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

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

  • 从客户、联系人、设施和客户中删除AddressLine1、AddressLine2、城市、州或省、邮政编码
  • 使用字段AddressTypeID、AddressTypeName、AddressTypeDescription、AddressTypeActive、LastUpdateUser、LastUpdateTime创建AddressTypes表
  • 创建包含以下字段的地址表:AddressID(PK)、AddressTypeID(FK)、AddressLine1、AddressLine2、城市、州或省、PostalCode、LastUpdateUser、LastUpdateTime、CustomerID(FK)、ClientID(FK)、ContactID(FK)、FacilityID(FK)
  • 在addresses表上,设置一个约束,以便CustomerID、ClientID、ContactID或FacilityID外键中一次只能有一个非空
  • 通过这种方式,您将所有地址都放在一个表中,它们可以引用您需要的任何记录,您的引用完整性是完整的,并且您不需要遍历中间表


    缺点是,如果要将地址添加到新的对象类(例如Employee表),则必须将EmployeeID列添加到addresses表,但是这很容易。

    我们数据库中有一个附加的东西,你可能要考虑的是,在一个触发器表上有一个对应的标志,用一个触发器强制每个人只有一个地址可以作为对应。我们向数据库中的人发送大量邮件,并且知道在发送邮件时,我们需要为此人使用三个地址中的哪一个是非常宝贵的。在查询时,每个人只获取一个地址也会更容易,以避免在某些报告中每个人获取多个记录。

    请参阅:etc拥有多个地址表有什么错?如何使用此结构对ID强制执行外键约束?或者您不介意吗?插入/修改触发器验证ID列相对于LinkTypeID是否有效。链接类型ID、地址ID和地址类型ID列上的FKs,以及父表上的“删除限制”。我认为这是声明性的,但也可能是触发器。(MS SQL Server 2005)添加这么多主键的意义何在?相反,主键可以使生活更轻松,并允许一对多关系,其中客户(仅一个示例)可以有多个地址。客户可以有多个地址。Addresses表可以有多个引用相同CustomerID的行。你不能同时拥有一个客户和一个联系人的相同地址。如果一个地址引用了两个不同的客户,因为他们住在同一所房子里怎么办?@NonSenseCreative,你可以拥有两个相同地址的地址Line1,City,StateOprovice,PostalCode