如果要在关系表中存储国际地理地址,最灵活的模式是什么?每个地址部分都应该分成自己的字段,还是更像自由文本?
将不同格式的地址分开存储在不同的表中有意义吗?例如,为美国地址、加拿大地址、英国地址等创建一个表...
如果要在关系表中存储国际地理地址,最灵活的模式是什么?每个地址部分都应该分成自己的字段,还是更像自由文本?
将不同格式的地址分开存储在不同的表中有意义吗?例如,为美国地址、加拿大地址、英国地址等创建一个表...
我会从我的博客文章 - 地址存储的一课(在archive.org上)中总结我的想法。
在我的当前项目中[我在物流公司工作],我们正在存储国际地址。 我已经研究了全世界的地址设计了数据库的这部分。 有很多不同的格式。 在西方世界,我们倾向于使用一个相当统一的格式 - 一些差异,但它们大多数是:
这似乎覆盖了大多数国家,但字段的排序可能会显示不同。您可以在http://www.bitboost.com/ref/international-address-formats.html#Formats上找到显示格式的列表。
例如,在许多国家中,邮政编码位于城市名称之前,街道号位于街道名称之后。在加拿大,美国和英国,街道号位于街道名称之前,而邮编(或ZIP)在城市名称之后。
关于将地址分离到不同的国家的问题,我不建议这样做,因为它会在其他领域(例如报告)中使生活更加困难。我提供的格式覆盖了我们物流数据库中所有地址的美国,加拿大,墨西哥和英国,没有任何问题。它还涵盖了我们所有的欧洲,中国,日本和马来西亚地址。我不能代表其他国家,但我还没有存储过这些字段不支持的国家的地址。
我不建议采用其他人和许多数据库中看到的 Address1、Address2、Address3 格式,因为从包含字母数字混合的字符串中解析地址信息并不像首次看起来那么简单 - 特别是如果由于错误信息、输入错误、拼写错误等而导致数据输入不正确时。如果您分离字段,可以使用距离算法检查可能的意义,使用概率检查街道名称与邮政编码和街道号,或检查省市与街道名称等。当您有一个字符串表示您的整个街道地址时,请尝试执行其中任何操作都不是一件微不足道的事情。注意不要过度分析地址格式,否则很可能会得到大多数用户需要绕开的规范,从而迫使他们使用错误的字段或只填写主要字段并忽略额外字段。
保持简单。
像BenAlabaster提到的StreetType在与英语或西班牙语等孤立语言不同的语言一起使用时会造成问题。
为了向您展示野外情况有多么糟糕:阿姆斯特丹的"Henriette Roland Holststraat"由"Henriette" + "Roland Holst" + "straat"组成,可以缩写为"Roland Holststraat",或者"H.R.Holststr."或"Henriette Roland-Holst straat"的拼写错误取决于天气。除非你对地球上每个国家都有最新的街道注册表,否则你将一无所获。
最后,要小心,在一些多语言国家,名字可能会因语言不同而不同!例如,在布鲁塞尔,许多街道都有法语和荷兰语名称:"Avenu du Port"和"Havenlaan",取决于收件人的首选语言。(Google地图交替显示两个名称,以确保安全。)
您可以尝试设计各种巧妙的技巧,但销售代表会理解这个吗?
作为对@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
为了覆盖国际地址,地址字段不应过于具体或过于抽象。
以下演示几乎涵盖了世界上所有的地址:
*****************************************************************
Type Field name Displayed name in your form
*****************************************************************
INT id (PK)
VARCHAR(100) country Country
VARCHAR(100) zip_code Zip code
VARCHAR(100) state State, province or prefecture
VARCHAR(100) city City
VARCHAR(100) street Street address or PO Box
VARCHAR(100) building Apt, office, suite, etc. (Optional)
*****************************************************************
Ben Alabaster的答案评论: 为了根据国家格式化地址,您可以使用一个格式化表格,该表格具有将每个国家的列顺序作为单独行的排序。
字段顺序可以编码为使用复杂的网格布局。
按国家分隔地址没有意义。随着国家数量增加,这将会变得混乱,并且如果您想要找到国际客户的所有地址,则会遇到麻烦。采用Ben建议的地址类型也可能导致模棱两可,当您拥有既有建筑号码又有公寓号码的地址时。我可能在一个公寓大楼中,在那里每座建筑都有不同的名称。这在印度非常普遍。
我使用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
唯一的方法是将它们分割成:
Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup
由于几乎每个国家都有自己的地址数据标准,而且每个国家的邮政编码格式也不同。
您可以从类似问题的我的帖子中获得一些小问题的样本。
这不应该让每个国家分开地址,因为有些国家只有少数地址约定。一些流行的约定包括在小村庄中没有街道,只有村名和编号,而在大城市的地址中有街道。我了解到,在匈牙利首都布达佩斯,有几条街道有相同的名称(您可以通过城市的区号来区分它们),而其他城市没有这样的地址(来自匈牙利的人可能会确认这是真的)。因此,地址格式的总数将是国家数量乘以该国的地址格式数量...可以使用不同的表格完成,但这将是可怕的工作。
我知道这是一个非常古老的话题,已经有了答案,但我也想发表一下我的看法。这完全取决于您的项目目标以及您希望目标用户如何输入地址。Ben的建议可以让您准确解析地址,但另一方面可能会导致更长(可能更令人沮丧)的用户数据输入过程。Stephen Wrighton的建议更简单,因此用户输入地址可能更容易。
我还看到过一些模型,只有一个“地址”列,可以捕获典型的街道号码、类型、街道名称、单元/公寓号码等,所有这些都在一个列中,同时保留城市、国家、地区等在其他列中。类似于Stephen的模型,但Address1、Address2和Address3都合并成一个列。
我的观点是,最灵活的模型往往是最不限制的,这取决于您对灵活性的理解。