在数据库中存储邮政地址的最佳实践(RDBMS)?

在RDBMS中存储邮政地址的最佳实践是否有很好的参考? 似乎有很多可以做出的权衡,每个人都有很多的利弊得到评估 – 这一定会一次又一次地完成? 也许有人至less写了一些经验教训的地方?

我讨论的折衷的例子是将邮政编码作为整数存储为字符字段,应将房号存储为单独的字段或地址线1的一部分,应该将套房/公寓/等号码归一化或仅存储为在地址栏2中的文本块,你如何处理邮编+4(单独的字段或一个大的字段,整数与文本)? 等等

我现在主要关心美国的地址,但是我想有一些最佳实践可以帮助你自己准备好走向全球(例如,像地区一样适当地命名字段,而不是州或邮政编码,而不是邮政编码,等等

作为一个“国际”用户,与处理仅以美国格式地址为导向的网站相比,没有什么比这更令人沮丧的了。 开始时有点粗鲁,但是validation过于热情也成了一个严重的问题。

如果你关心的是走向世界,唯一的build议就是保持自由的forms。 不同的国家有不同的规定 – 有些规定,门牌号码在街道名称前面,有些在后面。 有些国家,有些地区,有些国家,还有一些国家的组合。 在英国,邮政编码不是邮政编码,而是包含字母和数字的邮政编码。

我只是build议〜10行可变长度的string,以及一个单独的邮政编码字段(并且要小心你如何描述以应对国家的敏感性)。 让用户/客户决定如何写他们的地址。

对于更多的国际使用, Drupal地址字段使用的模式之一。 它基于xNAL标准 ,似乎涵盖了大多数国际案例。 有一点挖掘到这个模块将揭示一些很好的解释和validation国际地址的珍珠。 它还有一个不错的行政区域(省,州,州等)与ISO代码。

以下是从模块页面复制的模式的要点:

country => Country (always required, 2 character ISO code) name_line => Full name (default name entry) first_name => First name last_name => Last name organisation_name => Company administrative_area => State / Province / Region (ISO code when available) sub_administrative_area => County / District (unused) locality => City / Town dependent_locality => Dependent locality (unused) postal_code => Postal code / ZIP Code thoroughfare => Street address premise => Apartment, Suite, Box number, etc. sub_premise => Sub premise (unused) 

我学到的一课:

  • 不要在数字上存储任何东西。
  • 在可能的情况下将国家和行政区域存储为ISO代码。
  • 当你不知道的时候,要求放宽领域。 有些国家可能不会把你认为理所当然的领域,甚至是localitythoroughfare等基本的东西。

您应该考虑将房屋号码存储为字符字段而不是数字,这是因为“半数”或我现在的地址等类似“129A”的特殊情况 – 但A不被视为公寓送货服务的号码。

如果您需要有关其他国家如何使用邮政地址的全面信息,请点击以下链接(哥伦比亚大学):

弗兰克的邮政地址强制性指南
国际邮件的有效寻址

我已经完成了这个(严格地模拟数据库中的地址结构),而且我再也不会这样做了。 你无法想象有多么疯狂的例外,你必须考虑作为一个规则。

我隐约记得挪威邮政编码(我认为)有一些问题,除了奥斯陆,它们都是4个职位,而奥斯陆有18个左右。

我确信,从我们开始使用我们所有国内地址的正确邮政编码的那一刻起,不less人开始抱怨他们的邮件来得太迟。 原来那些人住在靠近邮政地区的边界,尽pipe真的有人住在邮政地区,比如1​​600,实际上他的邮件应该寄给邮政区1610,因为实际上是邮政区附近实际上服务他,所以送他的邮件到他的正确的邮政区域将采取那个邮件几天更长时间到达,因为在正确的邮政局需要的不需要的干预转发它到不正确的邮政区域…

(我们最后在国内以ISO代码“ZZ”注册了在国外的地址。)

除非你打算在街道号码或邮政编码上做math,否则你只是将未来的痛苦存储为数字而引起的。

你可能会在这里和那里保存几个字节,也许可以得到一个更快的索引,但是当你在美国邮政或者你正在处理的其他国家时,你是怎么决定引入这些代码的?

磁盘空间的成本将比以后修复它的成本便宜很多… y2k任何人?

你当然应该咨询“ 这是一个很好的方式来模拟关系数据库中的地址信息 ”,但你的问题不是直接重复的。

肯定有很多预先存在的答案(例如,查看DatabaseAnswers上的示例数据模型)。 许多预先存在的答案在某些情况下是有缺陷的(根本不selectDB答案)。

要考虑的一个主要问题是地址的范围。 如果你的数据库必须处理国际地址,你必须比你只需要处理一个国家的地址更灵活。

在我看来,logging地址的“地址标签图像”并分别分析内容往往 (并不总是 )是明智的。 这使您可以处理不同国家之间邮政编码放置之间的差异。 当然,你可以写一个分析器和一个格式器来处理不同国家的偏心情况(例如,美国的地址有2或3行;相比之下,英国地址可以有更多的地址;我定期写入的地址有9行)。 但是,让人类进行分析和格式化并让DBMS存储数据会更容易。

加上Jonathan Leffler和Paul Fisher所说的话

如果您曾经预计将加拿大或墨西哥的邮政地址添加到您的要求中,则将postal-code作为string存储是必须的。 加拿大有字母数字的邮政编码,我不记得墨西哥的头像是什么样的。

我发现列出从最小的离散单位到最大的所有可能的领域是最简单的方法。 用户将填写他们认为合适的字段。 我的地址表如下所示:

 ********************************* Field Type ********************************* address_id (PK) int unit string building string street string city string region string country string address_code string ********************************* 

将ZIP存储为NUMBER或VARCHAR的“权衡”在哪里? 这只是一个select – 除非双方都有好处,否则这不是一种折衷,而且你必须放弃一些好处才能获得其他好处。

除非拉链的总和有任何意义,拉链作为数字是没有用的。

这可能是一个矫枉过正,但如果你需要一个解决scheme,可以与多个国家的工作,你需要以编程方式处理部分地址:

您可以使用两个表对特定于国家/地区的地址进行处理:一个具有10个VARCHAR2列的generics表,10个数字列,另一个将这些字段映射为提示的表,以及一个将地址结构绑定到国家/地区的国家/地区列。

我只是把所有的字段放在一个大的NVARCHAR(1000)字段中,用一个textarea元素为用户input值(除非你想对例如邮政编码进行分析)。 所有的地址栏1,地址栏2等input信息都是非常令人讨厌的,如果你的地址不符合这种格式(你知道还有其他国家不是美国)。

如果您需要validation地址或使用它来处理信用卡付款,那么您至less需要一点结构。 一个自由forms的文本块不能很好地工作。

邮政编码是用于validation支付卡交易而不使用整个地址的通用可选字段。 所以有一个单独的,慷慨大小的领域(至less10个字符)。

灵感来自数据库答案

 Line1 Line2 Line3 City Country_Province PostalCode CountryId OtherDetails