鉴于任务的存储国际地理地址在一个关系表,什么是最为灵活的架构?应该每个部分的地址被分解成他们自己的领域,还是应更像是免费的文字?

是否有任何意义的,在分离的不同格式的地址进入不同的表吗?例如,有一个表USAAddress,CanadianAddress,UKAddress...?

有帮助吗?

解决方案

我将总结一下我的想法从我的博客后 一个教训,在储存的地址.

上我的当前项目[我工作的一个物流公司],我们储存的国际地址。我已经做了研究地址,世界各地在设计这个部分的数据库。有很多不同的格式。在西方世界,我们倾向于使用一种较统一的格式-一些差异,但他们大多是:

  • 街道号码 -数字
  • 房屋或建筑物的名称 -[VarChar-在英国的一些住房/建筑物的名称,不过数量]
  • 街道号码的后缀 [VarChar,虽然在大多数情况下,Char(1)就足够了]
    • A、B等
  • 街道名称 [VarChar]
  • 街道类型 [VarChar或Int如果你有一个StreetTypes表]
    • 迄今为止,我已经发现了262个独特类型在讲英语的世界,有可能更多,并且不要忘记其他语言,即Strasse,Rue等。
  • 街道方向 [VarChar(2)]
    • N,E,S,W,NE SE,NW,SW
  • 地址类型 [VarChar或Int如果你有一个AddressTypes表]
    • PO Box
    • 公寓
    • 建设
    • 地板
    • 办公室
    • 套房
    • 等等...
  • 地址类型的标识符 [VarChar]
    • 即框号公寓的数量、地数字记住的公寓号码和办事处有时有字母数字信息就像1A
  • 当地市政府 [VarChar或Int如果你有一个市政府表]
    • 例如,如果你的小村/村庄出现在的地址之前,该镇。
  • 城市/城镇 [VarChar或Int如果你有一个城市表]
  • 理事区 [VarChar或Int如果你有一个地区表]
    • 状态(美国)
    • 省(加拿大)
    • 联邦区(墨西哥)
    • 郡(英国)
    • 等等...
  • 邮政地区 [VarChar]
    • 拉链(美国)
    • 邮政编码(加拿大、墨西哥)
    • 邮政编码(英国)
  • [VarChar或Int如果你有一个国家表]

这似乎涵盖了大多数国家,但所订购的领域可以显示不同。你可以找到一个列表中的显示格式 http://www.bitboost.com/ref/international-address-formats.html#Formats

例如,在许多国家的邮政编码落之前的城市名和街数落后的街道名称。在加拿大,美国和英国的街道号码之前的街道名称和邮政编码(编)之后该城市的名称。

在回答你的问题是关于分离的地址进入不同的国家,我不会建议,它只会使生活更难在其他领域,例如报告。该格式,我已经提供了涵盖了所有的地址在我们的后勤数据库,其中涵盖美国、加拿大、墨西哥和英国没有任何问题。它还涉及我们所有的欧洲、中国、日本和马来西亚的地址。我不能代表其他国家但我没有到商店的地址从一个国家,这些领域不会的支持。

我不建议将与Address1,Address2,Address3格式,建议由其他人,看到在许多数据库,因为分析信息的地址出的一个字母数字符串不是简单的,因为它可能初看起来,尤其是如果数据是不正确地输入,由于错误信息,错字,拼写错误等。如果你单独的领域可以使用的距离算法,以检查可能的含义,使用的概率,检查街道名称对邮政编码和街头数量或检查省和城市对街道名称等。尝试做任何的时候你已经有了一个字符串表示你的整个街道地址。这不是一个简单的问题通过任何幻想。

QA上的地址数据库是一个头疼的时期。最简单的方法来简化你的生活在这个区域是确保所有领域只持有一个单一的信息可以自动核实,正在输入时间。概率,距离算法和定期的表情可以检查有效性的进入和向用户提供反馈为什么他们错误,并提出适当的修正。

一个警告要注意的是道路的名称,也是街类型-如果你是复盖加拿大你需要知道的"道路"在多伦多,这将之旅你最大的时候如果你使用的地址1、2、3的格式。这可能发生在其他地方,虽然我不知道他们-这个实例就足以让我尖叫跆拳道?!

其他提示

要小心,不要过度分析地址格式。当你这样做,你很可能有一个规范,最终大多数用户将需要工作的围绕的,有效地迫使他们使用了错误的字段,或者只填充主字段,而忽略了额外的字段。

<强>保持简单起见。

一个StreetType喜欢通过BenAlabaster提到的,当你开始从隔离喜欢英语或西班牙语语言不同的语言的工作会引起问题。

要告诉你在野外如何坏的东西可得:在“亨丽埃特罗兰Holststraat”在阿姆斯特丹,从“亨丽埃特” +“罗兰·霍尔斯特” +“STRAAT”建起来了,可缩写为“罗兰Holststraat”或 “罗兰Holststr。”,或者拼错为 “HRHolststr。”或“亨丽埃特罗兰 - 霍尔斯特STRAAT”,这取决于天气。除非你有在地球上每个国家一个上最新街寄存器,你会无处可去。

最后,要小心,在一些多语言国家,名称可以是从一种语言到另一种不同的!例如,在布鲁塞尔,许多街道既有法国荷兰名字:“Avenu du Port的”和“Havenlaan”,根据收件人的首选语言。 (谷歌地图显示两个交替的名称,只是要在安全方面。)

您可以在这里尝试制定各种聪明的把戏,但销售代表。要理解这

那取决于你想要做什么。

我发现它总是容易使用的地址,用于其他目的(例如验证对美国邮政数据或获取运费由UPS/FEDEX),如果他们分离。

这是我通常使用的地址:

  • 地址1号线
  • 地址2号线
  • 地址3号线
  • 城市
  • 区域
  • 邮政编码

在响应的编辑: 对于大多数情况下,我看不到使用。表我上面列出具有足够的领域(并且是通用的足够的)对于大多数国家的地址。

地址

作为一个截然相反的极好的回答@BenAlabaster提供了,你可以简单地具有:

address       TEXT(300)
postal_code   VARCHAR(15)
country_code  VARCHAR(2)

你的客户端形式的布局,仍然可以作为复杂,因为你认为合适的(或使用多行输入的用户可以人工输入他们的地址)。然后你可以添加的线路打破在该地址必要的。

你的国家表看起来如下:

country_code  VARCHAR(2)
country_name  VARCHAR(255)

此外,您可能已经 一个 如下:

postal_code_required  TINYINT(1)
postal_code_regex     VARCHAR(255) NULL DEFAULT NULL

然后使用下列来设计你的国家表:

这里的一个故事的人跌倒在这个问题:

我说作为一个人生活和工作在一个大洲(欧洲、亚洲、北美洲)。以我的经验,以及经验与我共事的人,已经从我们更容易使用的系统做到以下几点:

  1. 提供三线进入我会一类的地址。通过这三个线在当地的邮政服务作为我的类型,逐字。让我使用的任何角落我想;使用UTF-8或者更好的东西。
  2. 如果你的系统具有商业要求,需要我指定特定信息(例如邮政编码、县状态,等等。),要求为该分开。通过业务要求,我的意思是事情状分析;这些位的信息不应该是共享与当地的邮政服务(除非我也发生在编写相同的信息进入一个三线从点1,上文)。
  3. 有一个拉,要求我指定类别的位置的地址我提供线的1点上,也许是国家。
  4. 如果你必须分析的信息提供在线点1,用我的答案第3点,以选择regex.运行,regex对该信息在1点来分析它。尝试填补的用户接口的因素的第2点使用的输出regex.如果我正确的,自动填充信息--使用的事实,我改变了它可以提高你的regex.同样,尽可能多给我一个机会来审查并纠正输出regex:没有人知道更好的是什么我用的通信比我。

系统建立这样的,我找到,让我的生活最容易的。特别是,当我发送邮件向邮政系统中有关其公司几乎没有任何功能的内部知识。

如果你的公司没有内部知识有关的特别邮政系统,使用我选择在3点告知其图显示你给我。很多人知道什么美国邮政系统预计在包装;如果我选择我们在3点,随时使景看起来适合于我们地址。如果我选择一个国家对其公司什么都不知道--显示一个通用的三线,让我休息;别逼我使用ASCII。

让我们真正的在这里--建设一个完整的、百科全书数据库的所有全球邮政系统(的公共和私人)是一项艰巨任务在最好的,如果不是不可能的一个。还有,例如,邮政系统在其中仅在当地,最后一英里的载体真的知道一个地址位于何处。有时候能够通过注意到,载运包装上是非常有用的。和测绘的当地知识的每一个边缘的情况下载入数据库确实是一个不可能完成的任务。

只是问问哥德尔.(然后问问自己,如果你试图使用一个不言自明的系统模型的一个宇宙的论述,给予或采取某种形式的算术就像一套理论或关系的代数。)

评论Ben雪花的回答:格式化地址的基础上的国家,可以使用格式表的顺序列的每个国家单独行。

  • AddressFormat(CountryCode,FieldName,FieldOrder)

该领域的了编码使用的复杂的格局。

是没有意义的,在分离地址通过的国家。这将是混乱的国家数目增加了,你的麻烦,如果你想要找到所有的地址的人说,一个国际客户。有一个地址类建议通过本也可以导致含糊不清的时候你有一个地址,有两个建筑物的数量和公寓的数量。我可能是在一个公寓楼,每栋楼都有不同的名称。这是很常见的,在印度。

我使用 https://github.com/commerceguys/addressing 库格式化国际地址和他们使用这些元素:

Country
Administrative area
Locality (City)
Dependent Locality (in: BR, CN, IR, MY, MX, NZ, PH, KR, ZA, TH)
Postal code
Sorting code
Address line 1
Address line 2
Organization
Recipient

如果要分析街道这doen't帮助(名称,门牌号码,...)。

顺便说一下。如果你正在寻找一个多语言的国家列表: https://github.com/umpirsky/country-list

唯一的办法是以分裂它们:

Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup

由于几乎每个国家都有它自己的标准具有的地址数据,并且每个国家有不同格式的邮编.
你可以有一个小样本的问题
我的帖子 从一个类似的问题。

这不应该意识到独立的地址,对每一个国家,因为有些国家里,你有几个地址的公约。一些受欢迎的公约包括没有街道上的小村庄,唯一的村庄名称和数量,同时满街都是在大城市的地址。我已经了解到,在匈牙利首都布达佩斯,有几个街道上具有相同的名称(你不同他们通过市区数量),而其他城市不具有这样的地址(人从匈牙利实际上可以确认,如果这是真实)。所以总数的地址格式将numer_of_countries乘数的地址格式在这个国家...可以用不同的表格,但这将是可怕的工作要做。

我知道这是一个已经回答了一个非常古老的话题,但我以为我会扔我的两分钱中也是如此。这一切都取决于你的项目目标,以及如何你希望你的目标用户输入的地址。 Ben的建议可以让你准确地解析地址,但另一方面可以使较长的(也可能是更令人沮丧的)用户数据输入过程。斯蒂芬Wrighton的建议比较简单,而且可能是更容易为用户输入地址结果。

我也看到了一些模型,只是有一个“地址”栏,将捕获一列典型的街道数量,类型,街道名称,单元/公寓号码等等所有,同时保持城市,国家,地区等其他列内。类似斯蒂芬的模型,但是地址1,地址和地址3全部合并成一列。

我的看法是,最灵活的机型往往是那些限制最少的,这取决于你的灵活解释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top