世界上所有地址都有通用的街道地址数据库设计吗?


122

我是一名程序员,老实说,我不了解世界上的街道地址结构,而在我的国家/地区却是如此:)那么,哪种存储街道地址的最佳且通用的数据库设计是什么?它应该是如此简单易用,快速查询和动态存储该标识只是一个ID世界所有街道地址
非常感谢



您询问了街道地址,但所有答案都与邮政地址有关(有什么区别?)。也许标题应该改变?
wrygiel

Answers:


123

可以在一组标准字段中代表来自许多不同国家的地址。除了在中国以外,命名或编号建筑物所在的命名通道(通行费)的基本思想是相当标准的。其他近乎通用的概念包括:给定居点(城市/城镇/村庄)命名,通常可以将其命名为位置;命名区域并分配字母数字邮政编码。请注意,邮政编码(也称为邮政编码)仅在某些国家/地区是纯数字的。如果您真的想通用,则需要很多字段。

万国邮联万国邮政联盟以标准格式提供许多国家的地址数据。请注意,UPU格式包含整个国家/地区的所有地址(低至可用字段精度),因此是关系型的。如果要存储客户地址(仅存储所有可能地址的一小部分),则最好使用包含所有字段和每行一个地址的单个表(或纯格式)。

存储地址的合理格式如下:

  • 地址行1-4
  • 地区性
  • 地区
  • 邮政编码(或邮政编码)
  • 国家

地址线1-4可以容纳以下组件:

  • 建造
  • 副楼
  • 房号(门牌号)
  • 前提范围
  • 通道
  • 子通道
  • 双重依赖地区
  • 次地区

通常只使用3条地址线,但这通常不足。当然,可能需要更多行以正式格式表示所有地址,但是逗号始终可以用作行分隔符,这意味着仍可以捕获信息。

通常,数据分析将按地区,地区,邮政编码和国家/地区进行,用户输入数据时这些元素相当容易理解。这就是为什么这些元素应存储为单独的字段的原因。但是,请勿强迫用户提供邮政编码或地区,否则可能无法在本地使用。

位置可能不清楚,尤其是地图位置和邮政位置之间的区别。邮政所在地是邮政当局认为的地方,有时可能是附近的大城镇。但是,邮政编码通常可以解决那里的任何问题或差异,即使不使用官方的邮政所在地,也可以正确交付。


1
您可以提供万国邮联的网址吗?(是的,我知道我可以找到它-但是最好的答案并不能使人们进行搜索。)
乔纳森·莱夫勒

尝试upu.int/post_code/en/…并在下拉列表中选择合适的国家/地区
-barrowc

为万国邮联邮政*代码产品添加了URL
爱德华·罗斯

17
另外,某些国家(例如爱尔兰共和国)不使用邮政编码。如果我有多少分必须输入邮政编码(不适用)作为邮政编码,因为它是必填字段,那么我必须输入。。。我现在只有5或6美分:)
Binary Worrier

如果万国邮联有可下载的列表,那么目前,他们已经做好了很好的隐藏工作。
Jahmic

47

看看数据库答案。具体来说,这涵盖了许多情况:

(所有可变长度字符数据类型)

AddressId
Line1
Line2
Line3
City
ZipOrPostcode
StateProvinceCounty
CountryId
OtherAddressDetails

在此处输入图片说明


我没有投票,但是我认为唯一可行的方法是,除AddressId和Line1之外的所有其他字段都是可选的。在这种情况下,它不太有用。

11
数据类型很重要-并非每个国家都有整数邮政编码!如果一位同事与加拿大的一位客户很快就发现了这一点。
埃里克

1
@Eric:除了ID字段外,所有其他字段都是字符数据类型
Mitch Wheat

2
对于国家/地区ID,您应该使用ISO 3166 2个字母(或3个字母)的国家/地区代码。建议的架构允许您存储分析的地址;它不会告诉您如何格式化。(哦,英国有字母数字邮政编码-IP31 3GH,SE1W 9PQ等。我认为第二组始终是NAA;第一组以A开头并包含至少一个N(A = alpha,N =数字),但没有什么会令我感到惊讶。)
乔纳森·莱夫勒

@Neil:是的。不同国家/地区的差异很大,您无法使用一个表,而期望数据库对其进行验证。
Dave Sherohman,2009年

26

问问自己,存储此数据的主要目的是什么?您是否打算将邮件实际发送给该地址的人?追踪人口统计资料,人口?在一些基本的身份验证/验证过程中,能否要求呼叫者提供正确的地址?上述所有的?以上都不是?

根据您的实际需求,您将确定a)并不重要,可以采用自由文本方法,或者b)所有国家/地区的结构化/特定字段,或c)国家/地区特定的体系结构。


说得通。我正在寻找解决此问题的好方法,但是有很多不同的方法。如您所说:最好是从实际需求中选择。
displayname 2016年

12

有时,离街道地址最近的地方是城市。

我曾经有一个将印度所有中学纳入Google Maps的项目。我使用Google API编写了一个漂亮的程序,并认为这很容易。

然后我从客户端获得了数据。一些学校的地址是诸如“在市场对面,理发师旁边”或“公交车站附近”。

不幸的是,这使我的工作更加困难,因为Google API不支持该格式。


2
亚洲地址也因此而臭名昭著。“上海忍者西街73号2号楼2号楼,采用第二层上电梯,位于上海市
第四

9

对于国际地址,如果将信息分解为多个字段,则很难找到一种格式化信息的方法。例如,意大利地址使用:

<street address>
<zip> <town> <region>
<country>

Via Eroi della Repubblica
89861 Tropea VV
Italy

这与第二行的美国地址顺序大不相同。

另请参阅SO问题:

还要检查标签“ 邮政编码 ”。


编辑:区域和城镇的逆序-每个UPU


5

也许这很有用:https : //gist.github.com/259744 对于一个项目,我收集了有关世界所有国家的信息表,包括ISO代码,顶级域名,电话代码,汽车标志,长度和正则表达式压缩。不幸的是,国家/地区名称和注释仅使用德语...


2

取决于您准备使用哪种自由格式的字段。一个自由格式的地址字段显然总是可以的,但是对缩小地理范围的帮助相对较小。

您将遇到的问题是,各个国家/地区的地理层次结构差异太大。哎呀,有些国家甚至没有到处都有“街道地址”。

我建议您不要尝试使其变得太聪明。


2

与这里的其他答案不同,我相信可以有一个结构化的地址数据库。

简而言之,我可以想到以下结构:

  • 国家
  • 地区(州/省)
  • 地区(城市)
  • 子地区(县/地区的其他细分)

但是如何快速查询呢?

我一直认为可以实现的一种方法是,索要邮政编码(或邮政编码),该邮政编码因国家/地区而异,但在该国家/地区内部却很稳定。

这样,您可以围绕世界各地邮政局提供的信息来整理数据。


2

通用数据模型的成名人物Len Silverston 建议您采用一个单独的层次结构,GEOGRAPHIC BOUNDARIES具体取决于您愿意接受简单的STREET ADDRESS LINEs还是按国家/地区衍生的形式。


1
的确,Silverston提出的模型非常好,涵盖了很多领域,但是我仍然认为这种复杂性不适用于网络(此时),特别是从最终用户的角度来看。最后,可用性(几乎)总是胜利。
Alix Axel

2

不,绝对不是。如果比较美国和日本地址的工作方式,您会发现这是不可能的。

更新:

再三考虑,任何事情都可以做,但是需要权衡取舍。

一种方法是使用address和address_attribute表对它们进行建模,它们之间的比例为1:m,任何东西都可以建模。address_attribute表将包含一个pk,一个名称,一个值和一个指向其地址父级pk的fk。这几乎就像使用带有名称,值对的Map。

权衡是每次您要地址时都必须进行JOIN。您还必须询问address_attributes的名称,以弄清楚每次要处理的内容。

另一种方法是对世界各地的地址建模进行更全面的研究。在面向对象的世界中,对于日本,中国,您可能拥有西方的Address类(street1 / street2 / city / state / zip)和其他Address类,并且需要平铺地址空间的类。然后,您将拥有一个主地址表和其他类型的子表,它们之间具有1:1的关系。

亚马逊或eBay如何做到这一点?他们运送国际。他们是否具有特定于语言环境的UI功能?我只使用了美国语言环境。


1
如果我需要大多数地址怎么办?
Arsen Mkrtchyan

抱歉,我在这里没有关注您。
duffymo,2009年

2

不,没有标准的寻址方案。它通常因国家而异。甚至万国邮政联盟也曾在“ 改善世界”说过,对所有人来说都没有。最好的解决方案是使用2/3字母的国家/地区代码标准(称为ISO 3166),并按该国家/地区的标准对待其他所有内容。

但是,如果您真的想为项目使用易于访问的工具,则可以尝试使用Google Place API


我非常喜欢这个想法,看看Google Place API是如何处理的!
安德鲁·斯蒂兹

1

您的设计应严格取决于您的目的。有人发布了如何构造数据。因此,如果您只想发送电子邮件给某人,它就可以。如果要使用此数据进行导航,事情将变得复杂。汽车导航将需要其他结构来包含交通信息(例如,单向道路),而步行导航将需要大量其他数据。这是一个小例子:在我的城市,我的邻居在公园附近。公园旁边是昔日的飞机场(实际上是欧洲最古老的飞机场之一),后来变成了航空博物馆。航空博物馆旁边是商业园。博物馆的街道号码是39,而商业园区的号码是39A开头的。因此,看起来39和39A距离很近-但从另一个到另一个走大约要走一英里(如果要开车,走走甚至会更长)。
这只是我所在城市的一个小例子,我想您可能会发现很多例外情况(尤其是在每个国家的农村或荒野地区)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.