5

我正在尝试规范化地址。

下图显示了我相信这个问题的相关表格。我想知道 ZipCodes 应该如何集成到模型中。这将用于国际地址,所以我知道 Zip/PostalCode 并非在任何地方都使用。我认为 City::ZipCode 是 1::0-n (我读过其他人说情况并非总是如此,但他们从未提供证据)。如果他们是正确的,那么我想这将是一个多对多的关系。由于每个地址最多只能有一个邮政编码,而一个邮政编码可以包含许多地址,我不知道如何规范这个模型。

由于地址可能包含也可能不包含邮政编码,因此我需要避免在地址表中将其作为可为空的 FK。

编辑: 只想强调提供的实体和属性从实际 DB 大幅缩减。它仅用作参考并解决我对在模型中包含邮政编码的位置的担忧。

在此处输入图像描述

4

6 回答 6

7

标准化您拥有的架构;添加一个表 Address-ZipCode 表,带有外键 Address ID 和 Zip Code;和主键地址 ID - 与地址表中的相同。然后通过在地址和新表之间使用左连接来包含邮政编码。仅当地址具有邮政编码时才会填充新表。

但是,我建议如果您尝试容纳国际地址,那么您所拥有的架构可能是不充分的 - 您将需要多个地址行和比图表中显示的更多级别的类别。遗漏的类别包括国家、次区域、城镇,可能还有其他。

我在这里的回答(非常长)显示了全面处理国际地址(和其他事情)所需的内容。除非您要处理多个国家/地区中每一个的数百万个地址,否则这是巨大的矫枉过正。

于 2011-04-03T16:27:07.570 回答
3

多年来,我一直在为几个不同的应用程序而苦苦挣扎。如何设置取决于您的需要。我在经济适用房工作,我们需要做的一件事是将不同的地理组成部分(城市、县、州等)与 HU(美国住房和城市发展)定义的各个地区联系起来。

我最终得到的看起来有点像这样:

tblState:
    StateID
    StateCode (AL, AK, AR . . . etc)
    StateName (Alabama, Alaska, Arkansas,  . . . etc)

tblCounty
    CountyID
    HUDRegionID FK to tblHUDRegion
    StateID FK to tbleState
    CountyName (Pierce County, WA; Lane County, OR)
NOTE: I recognize I could normalize even further and create a table of count names, many-to-many related to States ON stateID, but there's a limit, man!)

tblCity
    CityID
    CountyID
    CityName

tblZIPCOde
    ZIPCodeID
    CityID

tblHUDRegion
    HUDRegionID
    HUDRegionCode
    HUDRegionName

在我的例子中,HUD 区域是在县级定义的(一个 HUD 区域包括一个或多个县(在某些情况下或“县镇”)。每个 HUD 区域实际上都有一个唯一标识符定义为 ny HUD(HUD CBSA_Sub),我将其用作“HUD-region_code”。另外需要注意的是,HUD 区域可以包括一个或多个州的县。因此,HUD 区域标识符与县相关,但仅与州间接相关,通过每个县。对于例如,HUD“波特兰/温哥华/比弗顿”HUD MSA 包括俄勒冈州和华盛顿州的县(市)。

在您的情况下,您将需要再定义一个顶层 tblCountry。此外,您可能需要稍微调整“县”和“州”的概念以适应其他国家(“省”以及它们用于大于城市但小于州的细分的任何内容。“地区”可能适用于这种情况以及-我相信许多欧洲国家都使用“地区”)。

一个国家有一个或多个国家(或同等国家)。一个州有一个或多个县(或等效县)。一个县有一个或多个城市。城市往往至少有一个邮政编码。

在我的例子中,诸如 HUD 区域之类的区域往往被定义为这些级别之一的聚合。

在许多情况下,在这个 HUD 驱动模型之外,我必须开发(通常需要通过 ZIP 或县确定哪个 HUD MSA 正在工作。在所有情况下,假设 HUD 是不安全的区域包含在一个特定的状态中。

另外需要注意的是,USPS 会定期更改某些地区的邮政编码。

于 2011-04-03T16:55:43.947 回答
2

根据您在邮政编码规则中所在的国家/地区,可能会变得非常冒险。您可以很安全地假设一个邮政编码有一个官方城市名称,但美国和加拿大都允许邮政编码使用其他城市名称。我知道这一点是因为我为北美开发了邮政地址验证软件。非官方名称通常会被邮政当局认可,您通常必须允许使用它们。

因此,如果您希望能够使用非官方名称,则需要在城市和邮政编码之间使用 m:n。我会质疑为什么您无论如何都需要邮政编码的代码表。地址存储最好将它们视为独立的属性,而不是试图规范化它们。

如果您以某种方式认为您将能够使用数据库中的某些数据从邮政编码倒退到城市名称或从城市名称转发到邮政编码,那么您会让自己失望!有 USPS 和加拿大邮政认可的用于地址验证的软件解决方案,如果您花时间实际研究它,您会发现地址验证的问题域比您想象的要复杂得多如果地址准确性对您的应用程序很重要(并且在大多数情况下应该如此),那么请购买 3rd 方工具来进行地址验证并将您的地址存储在一个表中,其中包含对您有意义的列。

于 2011-04-03T17:33:20.670 回答
2

对于大多数需要准确、规则格式地址的实体来说,规范化或标准化地址是一个巨大的问题。(我在地址验证行业工作 - 为SmartyStreets 工作- 所以我已经处理了很多。)由于不同交付端点、地址更改、地址组件更新以及许多其他事情的复杂性,最好招募经过认证的服务来为您处理这些问题。

假设您使用的是美国地址,那么您可以很容易地使用 API 或列表处理服务来获取所需的数据。例如,如果您在使用 NULLable ZipCode FK 时遇到问题,那么您不妨将邮政编码附加到每个地址(如果找不到,那么为什么要保留它,因为它是一个错误的地址)。

其中一项服务是 SmartyStreets 的地址验证 API ,它处理 API 请求,或者您可以使用我们的批量地址验证工具处理现有的地址列表/表。

于 2012-01-26T19:40:02.670 回答
0

邮政编码 has_many 地址/地址属于_to zip_code。你需要标准化吗?大多数应用程序最好只在地址表中有一个 zip_code 列。维护国际地址的所有邮政编码是一场艰苦的战斗。

此外,您正在地址和城市中复制 region_id。您可能需要解释您的应用程序中的区域,但这看起来只需要在城市中。

于 2011-04-03T16:32:45.437 回答
0

在全球范围内,190 个国家中有 119 个使用邮政编码。不使用它们的著名国家包括爱尔兰和巴拿马。[1]

除了支持这一事实之外,这将是一个非常烦人的系统,它坚持要有邮政编码。它还应该允许邮政编码未知

在美国,每个“城市”至少有一个邮政编码,所以关系是正确的。我通过开发邮政编码数据库大约一年才知道这一点。

于 2011-04-03T16:34:20.307 回答