【问题标题】:Best practices for consistent and comprehensive address storage in a database [closed]数据库中一致和全面的地址存储的最佳实践[关闭]
【发布时间】:2010-09-12 16:14:24
【问题描述】:

是否有任何最佳实践(甚至标准)可以在数据库中以一致和全面的方式存储地址?

具体来说,我认为现阶段地址存储有两种情况:

  • 您只需要将地址与人、建筑物或任何项目相关联(最常见的情况)。那么一个带有文本列(address1、address2、zip、city)的平面表可能就足够了。这不是我感兴趣的情况。
  • 您希望对您的地址进行统计:特定街道、城市或...中有多少项目...然后您希望避免任何类型的拼写错误,并确保一致性。我的问题是关于这种特定情况下的最佳实践:建模一致地址数据库的最佳方法是什么?

针对特定国家/地区的设计/解决方案将是一个很好的开始。

ANSWER:似乎还没有对这个问题的完美答案,但是:

  • xALsuggested by Hank 一样,是最接近出现的全球标准的东西。不过,这似乎有点矫枉过正,我不确定很多人是否愿意在他们的数据库中实现它......
  • 要开始自己的设计(针对特定国家/地区),Dave's linkUniversal Postal Union (UPU) 网站是一个很好的起点。
  • 至于法国,地址有一个规范(非官方,但事实上的标准),上面有一个可爱的名字AFNOR XP Z10-011(仅限法语),并且必须付费。法国的UPU 描述基于此规范。
  • 我碰巧找到了瑞典的等效规范:SS 613401
  • 在欧洲层面,已经做出了一些努力,最终形成了标准 EN 14142-1。可通过CEN national members 获得。

【问题讨论】:

  • 在哪个国家/地区?不同国家/地区之间的地址格式和组成差异很大。如果您只处理一个国家/地区,则该模型可能比您想以结构化方式存储来自任何国家/地区的地址要简单得多....
  • 法国将是完美的 ;-) 你是对的:单一国家地址(美国将是最常见的,我相信)将是一个很好的起点。

标签: database standards modeling


【解决方案1】:

我自己也一直在考虑这个问题。到目前为止,这是我的松散想法,我想知道其他人的想法。

xAL(及其包含个人姓名的姐妹 XNAL)被 Google 和 Yahoo 的地理编码服务使用,这给了它一定的权重。但是由于可以在 xAL 中以许多不同的方式描述相同的地址——有些方式比其他方式更具体——所以我看不出 xAL 本身是如何成为一种可接受的数据存储格式。然而,它的一些字段名称可以使用,但实际上,在我公司运送到的 16 个国家/地区中唯一可以使用的基本格式如下:

enum address-fields { name, company-name, street-lines[], // up to 4 free-type street lines county/sublocality, city/town/district, state/province/region/territory, postal-code, country }

这很容易映射到单个数据库表中,只允许在大多数列上使用 NULL。这似乎是亚马逊和许多组织实际存储地址数据的方式。所以剩下的问题是我应该如何在程序员和任何 GUI 代码都可以轻松使用的对象模型中对此进行建模。我们是否有一个基本Address 类型以及每种地址类型的子类,例如AmericanAddressCanadianAddressGermanAddress 等等?这些地址类型中的每一个都知道如何设置自己的格式,并且可以选择了解一些关于字段验证的信息。

它们还可以返回有关每个字段的某种类型的元数据,例如以下伪代码数据结构:

structure address-field-metadata { field-number, // corresponds to the enumeration above field-index, // the order in which the field is usually displayed field-name, // a "localized" name; US == "State", CA == "Province", etc is-applicable, // whether or not the field is even looked at / valid is-required, // whether or not the field is required validation-regex, // an optional regex to apply against the field allowed-values[] // an optional array of specific values the field can be set to }

事实上,我们可以采用稍微不那么面向对象的方法,即拥有一个避开 .NET 属性并使用 AddressStrategy 来确定格式和验证规则的 Address 对象,而不是为每个国家/地区创建单独的地址对象,而不是实际上:

object address { set-field(field-number, field-value), address-strategy } object address-strategy { validate-field(field-number, field-value), cleanse-address(address), format-address(address, formatting-options) }

在设置字段时,Address 对象将调用其内部 AddressStrategy 对象上的适当方法。

使用SetField() 方法而不是使用getter 和setter 的属性的原因是,代码更容易以通用方式实际设置这些字段,而无需求助于反射或switch 语句。

你可以想象这个过程是这样的:

  1. GUI 代码调用工厂方法或类似方法来创建基于国家/地区的地址。 (因此,国家下拉菜单是客户选择的第一件事,或者根据文化信息或 IP 地址为他们预先选择了一个很好的猜测。)
  2. GUI 调用address.GetMetadata() 或类似方法并接收AddressFieldMetadata 结构的列表,如上所述。它可以使用此元数据来确定要显示哪些字段(忽略那些将is-applicable 设置为false 的字段),标记这些字段的内容(使用field-name 成员),以特定顺序显示这些字段,并执行粗略,对该数据进行演示级验证(使用is-requiredvalidation-regexallowed-values 成员)。
  3. GUI 使用field-number(对应于上面的枚举)及其给定值调用address.SetField() 方法。然后Address 对象或其策略可以对这些字段执行一些高级地址验证、调用地址清理器等。

如果我们想让Address 对象本身在创建后表现得像一个不可变对象,那么上面的内容可能会略有不同。 (我可能会尝试这样做,因为 Address 对象实际上更像是一种数据结构,并且可能永远不会有任何与自身相关的真实行为。)

这些有意义吗?我是否偏离 OOP 路径太远了?对我来说,这代表了在抽象到几乎不可能实现 (xAL) 与严格偏向美国之间的一种相当明智的折衷。


2 年后更新:我最终得到了一个与此类似的系统,并在my defunct blog 上写了这篇文章。

我觉得这个解决方案是遗留数据和关系数据存储之间的正确平衡,至少对于电子商务世界来说是这样。

【讨论】:

  • 您的博客链接代码为 410“已删除”。你有更新的链接吗?
  • 谢谢,我更新了存档副本的链接
【解决方案2】:

“xAl 是最接近出现的全球标准的东西。不过这似乎有点过头了,我不确定很多人会想要在他们的数据库中实现它......”

这不是一个相关的论点。如果系统需要“全面和一致”(即全球性),那么实施地址并不是一项简单的任务。实施这样的标准确实很耗时,但要满足规定的要求却是强制性的。

【讨论】:

    【解决方案3】:

    关于如何构建地址的权威通常是邮政服务,因此首先我会检查邮政服务在您经营的主要市场中使用的数据元素。

    有关国际邮政地址格式的非常具体和详细的​​信息,请参见万国邮政联盟的网站:http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml

    【讨论】:

      【解决方案4】:

      在美国,我建议选择国家地址变更供应商,并根据他们返回的内容对数据库进行建模。

      【讨论】:

        【解决方案5】:

        我之前问过类似的问题:Dynamic contact information data/design pattern: Is this in any way feasible?

        简短的回答:在数据库中存储地址或任何类型的联系信息很复杂。上面的可扩展地址语言 (xAL) 链接有一些有趣的信息,这些信息最接近我遇到的标准/最佳实践......

        【讨论】:

          【解决方案6】:

          如果你想要一致性,我基本上看到 2 个选择:

          1. 数据清洗
          2. 基本数据表查找

          广告 1. 我使用 SAS 系统,SAS Institute 提供了一个数据清理工具 - 这基本上会对您的数据进行一些检查和验证,并建议合并“Abram Lincoln Road”和“Abraham Lincoln Road”进入同一条街。我还认为它利用了包含城市邮政编码匹配等的国家数据库。

          广告 2。您建立了一个多项选择列表(即基本数据),添加新条目的人会从您的基本数据中的现有条目中进行选择。在您的事实表中,您存储街道名称的键而不是街道名称本身。如果您检测到拼写错误,您只需在基本数据中进行更正,所有实例都会通过键关系进行更正。

          请注意,这些选项并不相互排斥,您可以同时使用这两种方法。

          【讨论】:

            【解决方案7】:

            在英国有一种产品叫PAF from Royal Mail

            这为每个地址提供了一个唯一的密钥 - 不过,有一些障碍可以跳过。

            【讨论】:

            • PAF 存在问题,因为它只包含邮件投递到的地址。军械测量等效(OSAPR)在理论上更优越,因为它应该包括所有地址,但实际上容易出错并且不经常更新。许多地方当局最终使用自己的内部系统
            【解决方案8】:

            按照您的建议,我将使用Address 表,并将其基于xAL 跟踪的数据。

            【讨论】:

              【解决方案9】:

              规范化您的数据库架构,您将拥有确保正确一致性的完美结构。这就是为什么: http://weblogs.sqlteam.com/mladenp/archive/2008/09/17/Normalization-for-databases-is-like-Dependency-Injection-for-code.aspx

              【讨论】:

              • 是的,但是您是否知道此类数据库的经过验证的设计/规范化,还是每个人都必须重新发明我认为非常普遍需要的轮子?
              • 你可以google一下地址设计。但通常设计取决于您的业务需求。并非所有人都需要相同的模型。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-03-18
              • 1970-01-01
              • 2013-06-30
              • 2011-11-30
              • 2014-01-13
              • 2012-04-28
              • 2011-01-25
              相关资源
              最近更新 更多