数据库中如何将邮政编码转换为城市/州,反之亦然?

5
我对SQL和关系数据库不熟悉,但我有一个常见的问题。
我正在制作一个网站,每个用户提交帖子时必须提供邮政编码或城市/州的位置。如何处理这个问题是最佳实践?我是否应该创建一个包含邮政编码和城市/州的表格,并针对它们进行查询,还是有现成的解决方案来处理这个问题?
我使用的是SQL Server 2005,如果有区别的话。
我需要能够根据城市/州检索出邮政编码,或者能够根据邮政编码输出城市/州。
11个回答

10
你有几个选择。你可以从某人那里购买一个批量邮政编码库,它将按州列出邮政编码、城市、县等信息;或者你可以支付某人访问 Web 服务,该服务将在更细粒度上执行相同的功能。
最好选择邮政编码库选项,因为它的成本比 Web 服务低,并且提供更好的性能。如何查询或预处理此库取决于您。您提到 SQL Server,因此您可能需要状态、邮政编码和城市表,并包括它们之间的相关关系。您还需要为跨多个邮政编码的城市或具有多个城市的邮政编码提供规定,但这些问题都不是无法克服的。
至于如何处理用户输入的不确定性,您可以考虑寻求地址验证 Web 服务的帮助,尽管它们大多需要完整的送货地址才能进行验证。
编辑:看起来有一个SourceForge 项目提供免费的邮政编码数据,包括经纬度数据等。不确定它的正确性或当前性。
编辑2:在对那个SourceForge项目网站进行了一些简要查看后,看起来这是一个已经停止维护的项目。如果您使用这些数据,则需要为不存在于您的数据库中的邮政编码/城市提供一些容错机制。购买的批量库通常带有某种更新保证或更新定价计划等,可能更加可靠。

我没有投反对票,但请看我的回答。除非原帖涉及到用户,否则很难从邮编中找出城市或者反过来。除此之外,你基本上说了和我一样的话... - alphadogg
我会说,在存在歧义的情况下,可以通过一个页面来要求更多的细节信息 - 例如:"你的邮政编码是10027 - 你是指纽约市还是曼哈顿?" 并在旁边放置单选按钮。通常情况下,人们不需要看到这个页面;我认为它应该是一个次要的页面... - Erik Forbes
在异常情况下,对于遇到此问题的用户来说,这并不会是太大的负担。 - Erik Forbes
我最近刚完成了一个依赖于用户输入地址数据的系统,所以我知道这是可行的,即使在模糊的情况下也是如此。虽然在我的情况下(天气API互操作性),例如区分纽约市的行政区并不是那么重要。 - Erik Forbes
那么,我想一个好的反问是 - 您拥有完全准确的数据有多重要? - Erik Forbes
在Apple.com上完成结账流程 -- 他们只要求输入邮政编码数据,如果有歧义,他们会要求您澄清。这是一个经过(我假定)大量可用性测试的好例子。 - Alex Czarto

3
有一个与城市州表相关的ZipCode表。一些邮政编码与多个城市相关联,因此您可能需要让用户从他们想要的城市中进行选择,或者让他们覆盖默认设置。
我使用ZipInfo.com的付费服务,因为我需要额外的信息,例如纬度/经度、邮政编码类型和县。由于新的邮政编码不断添加或合并,所以您需要每年更新数据几次以保持一致性。

1

根据您正在构建的细节,Yelp有一个免费的社区API,可能能够为您提供所需的内容。请确保检查他们的使用条款等内容,以确保您遵守规定。

我知道这不是一个数据库中心的答案,但您正在做的事情可能不是最好在数据库本身处理。


1

有许多免费的地理编码网络服务可以让你从城市或州获取邮政编码,反之亦然。看看GeoNames网络服务。你可以这样做:检查你的数据库,如果你要查找的内容不在那里,就从网络服务中获取并添加它。


1
如果查询的原因是为了用户方便,这里有一种替代方法,不需要许可任何第三方数据库:
只需从您现有的姓名/地址表中查找城市/州,前提是邮政编码匹配。 如果有人先前为该邮政编码输入了条目,则可以从该条目中找到城市和州。 如果不存在先前的条目,则最坏的情况是用户必须输入城市和州。
这个解决方案假定您的需要是为了方便用户。 如果您更关心城市、州和邮政编码的准确验证,则最好许可经过验证的数据库。

0

对于美国州表,您可以使用以下查询,假设您在States表中有StateIdStateName,并且您有StateId自动递增。

此查询具有50个美国州...

INSERT INTO States
        ( StateName )
        VALUES
( 'Alabama'),
( 'Alaska'),
( 'Arizona'),
( 'Arkansas'),
( 'California'),
( 'Colorado'),
( 'Connecticut'),
( 'Delaware'),
( 'District of Columbia'),
( 'Florida'),
( 'Georgia'),
( 'Hawaii'),
( 'Idaho'),
( 'Illinois'),
( 'Indiana'),
( 'Iowa'),
( 'Kansas'),
( 'Kentucky'),
( 'Louisiana'),
( 'Maine'),
( 'Maryland'),
( 'Massachusetts'),
( 'Michigan'),
( 'Minnesota'),
( 'Mississippi'),
( 'Missouri'),
( 'Montana'),
( 'Nebraska'),
( 'Nevada'),
( 'New Hampshire'),
( 'New Jersey'),
( 'New Mexico'),
( 'New York'),
( 'North Carolina'),
( 'North Dakota'),
( 'Ohio'),
( 'Oklahoma'),
( 'Oregon'),
( 'Pennsylvania'),
( 'Puerto Rico'),
( 'Rhode Island'),
( 'South Carolina'),
( 'South Dakota'),
( 'Tennessee'),
( 'Texas'),
( 'Utah'),
( 'Vermont'),
( 'Virginia'),
( 'Washington'),
( 'West Virginia'),
( 'Wisconsin'),
( 'Wyoming');

0

我的理解是USPS Web API是免费使用的,但需要获得许可,这取决于多种因素,包括将使用它的程序的性质和您需要数据的原因。

如果您有资格使用它,那么这可能是您所需信息最准确的来源。


在注册USPS API时,请务必仔细考虑如何回答申请问题。他们提出了一些引导性问题,如果回答不正确,将会拒绝您的使用请求。此外,他们在去年假期期间遇到了严重的停机问题。 - DavGarcia

0

我不确定我理解这个问题。您需要允许其中一个,然后稍后返回两个吗?

即使使用可以购买的zip / city数据库,您也必须小心,因为有些城市跨越多个zip,因此您不能总是以那个方向“计算”。相反方向也存在类似问题。


用户可以提供其中任意一个,而我需要两个。 - mmcdole
那么,在许多情况下,除非你涉及到街道,否则你将无法计算出适当的缺失信息。 - alphadogg
例如,纽约市有六个邮政编码。如果您选择其中一个,比如10027,那么这个邮政编码属于两个城市:“纽约市”和“曼哈顿”。更不用说您的用户可能会将“纽约市”输入为“NYC”、“NY City”、“New York”等等。 - alphadogg

0

有一些可以购买和导入的库不是很昂贵。你们使用它们的问题将是您将需要进行持续的维护成本(不多)。邮政编码一直在变化,这意味着在6个月左右,您的数据将略有过时。您可能希望考虑与像谷歌地图这样的服务进行接口。在这里,我们采用混合方法。我们每6个月花费更新数据的金额,如果邮政编码不在表中,我们会根据谷歌地图验证它,以确保输入的信息仍然有效,而且它只是没有被输入到我们的系统中。如果它是有效的,我们就会更新系统,否则我们会让用户知道出现了错误。

另一个选择是ping USPS网站。我相信他们有一个按邮政编码查找城市/州的页面。


-1

我已经掌握了这个技巧。这里有一个免费的(压缩,csv):

托管在maphacks.com

表头是 zip,city,state,latitude,longitude,timezone,dst

现在,你可能会失去的是你没有为更新付费(这可能会在最后让你吃亏,但他们会尽量保持更新)


小心免费的东西,有时它们会消失。或者更新不干净。我曾经依赖过一个免费的东西...只有一次。如果你的数据库很重要,不要随意处理数据。垃圾进垃圾出。 - alphadogg
这个已经消失了,所以这个答案现在没有用了。 - Brilliand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接