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

时间:2009-05-30 12:47:12

标签: sql database-design street-address postal-code

我是程序员,说实话,不知道世界上的街道地址结构,我的国家是如何构建的:)所以哪个是存储街道地址的最佳和最常见的数据库设计?它应该是如此简单易用,快速查询和动态存储世界上所有街道地址,只需一个身份识别即可。非常感谢

12 个答案:

答案 0 :(得分:112)

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

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

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

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

地址行1-4可以包含如下组件:

  • 建筑
  • 子建筑
  • 房屋号码(门牌号码)
  • 前提范围
  • 通途
  • 子通途
  • 双依赖地区
  • 子地方

通常只使用3条地址线,但这通常是不够的。当然可以要求更多行代表官方格式的所有地址,但逗号总是可以用作行分隔符,这意味着仍然可以捕获信息。

通常,数据分析将按地区,地区,邮政编码和国家/地区进行,这些元素在输入数据时非常容易让用户理解。这就是为什么这些元素应该存储为单独的字段。但是,不要强制用户提供邮政编码或区域,它们可能不会在本地使用。

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

答案 1 :(得分:43)

看看Database Answers。具体来说,这涵盖了许多情况:

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

AddressId
Line1
Line2
Line3
City
ZipOrPostcode
StateProvinceCounty
CountryId
OtherAddressDetails

enter image description here

答案 2 :(得分:25)

问问自己存储这些数据的主要目的是什么?您是否打算实际向该地址的人发送邮件?跟踪人口统计,人口?作为一些基本认证/验证的一部分,能够向呼叫者询问他们的正确地址吗?上述所有的?以上都不是吗?

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

答案 3 :(得分:11)

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

我曾经有一个项目将印度的所有中学都放在谷歌地图上。我使用Google API编写了一个精巧的程序,并认为这很容易。

然后我从客户端获取数据。一些学校的地址是“从市场旁边,理发师旁边”或“近老巴士站”。

这让我的任务变得更加艰难,因为不幸的是,Google API不支持这种格式。

答案 4 :(得分:9)

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

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

Via Eroi della Repubblica
89861 Tropea VV
Italy

这与美国地址的顺序完全不同 - 在第二行。

另见SO问题:

另请查看代码“postal-code”。


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

答案 5 :(得分:5)

也许这很有用: https://gist.github.com/259744 对于一个项目,我收集了一份关于世界上所有国家的信息表,包括ISO代码,顶级域名,电话代码,汽车标志,长度和邮政编码。 不幸的是,国家名称和评论只有德语...

答案 6 :(得分:2)

取决于你准备好自由形式的字段。一个自由形式的地址字段显然总能做到,但对缩小地理位置的帮助相对较小。

您遇到的问题是各个国家/地区的地理层次级别存在太大差异。哎呀,有些国家到处都没有“街道地址”。

我建议你不要试图让它太聪明。

答案 7 :(得分:2)

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

刚出头,我可以想到以下结构:

  • 国家
  • 地区(州/省)
  • 地区(市/市)
  • 次地区(县/地区的其他分部)

但如何快速查询呢?

我一直认为可以实现的一种方法是要求邮政编码(或邮政编码)因国家而异,但在国内是可靠的。

通过这种方式,您可以围绕全球邮局提供的信息构建数据。

答案 8 :(得分:2)

Universal Data Model成名的Len Silverston推荐了一个单独的GEOGRAPHIC BOUNDARIES层次结构,取决于您愿意接受多少自由形式的简单STREET ADDRESS LINE或每个国家/地区衍生物。

答案 9 :(得分:2)

不,没有标准的寻址方案。它通常因国家/地区而异。 甚至万国邮政联盟也在Adressing the world, an address for everyone上说没有。对此最好的解决方案是使用称为ISO 3166的2/3字母国家/地区代码标准,并按国家标准处理其他所有内容。

但是,如果您真的非常渴望为项目使用易于使用的工具,可以试试Google Place API

答案 10 :(得分:1)

不,绝对没有。如果您比较美国和Japanese addresses的工作方式,您会发现这是不可能的。

更新:

第二个想法,任何事都可以做,但有一个权衡。

一种方法是使用address和address_attribute表对问题建模,它们之间的关系为1:m,任何事都可以建模。 address_attribute表将有一个pk,一个名称,一个值和一个指向其地址父pk的fk。这几乎就像使用名称,值对的地图。

每次想要一个地址时,必须进行权衡。您还必须询问address_attributes的名称,以确定每次处理的内容。

另一种方法是对地址如何在全球范围内建模进行更全面的研究。在面向对象的世界中,您可能拥有西部地址类(street1 / street2 / city / state / zip)以及日本,中国的其他类别,以及平铺地址空间所需的数量。然后你有一个主地址表和子表到其他类型,它们之间有1:1的关系。

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

答案 11 :(得分:1)

您的设计应该完全取决于您的目的。有些人已经发布了如何构建数据。因此,如果您只是想向某人发送电子邮件,那么它就可以。如果您想使用此数据进行导航,事情就会变得复杂。汽车导航将需要额外的结构来包含交通信息(例如单向道路),而导航将需要大量额外数据。这是一个小例子:在我的城市,我的邻居就在公园附近。公园旁边是前机场(实际上是欧洲最古老的机场之一),后来变成了航空博物馆。航空博物馆旁边是一个商业园。博物馆的街道号码是39,而商业园区的号码是39A。因此看起来39和39A似乎很接近 - 但是从一个到另一个步行需要大约一英里(如果乘车去的话甚至更长)。
这只是我的城市中的一个小例子,我想你可能会发现很多例外情况(特别是在每个国家的农村或荒野地区)。