将位置信息存储在数据库中的最佳方法是什么?

时间:2009-07-09 13:16:27

标签: database-design

位置数据基本上是树形结构。因此,当您向某人询问他们的地址时,您想知道他们居住的地区/郊区,城市/城镇,州/省和国家。

这个数据有望只设置一次,只需要很少的修改。大多数电子商务网站和许多其他网站都需要存储这类信息,但我很难找到它。也许是因为我没有寻找合适的术语,但我认为这将是一个已经解决的常见问题。

这引出了另一个问题。我在哪里可以获得这类信息,例如哪个地区属于哪个城市,哪些城市属于哪些州以及哪些州属于哪些国家?

编辑:为了使事情变得更复杂,我希望能够提供一种通用的解决方案,因为例如一些国家不使用邮政编码,他们使用邮政编码,它有点相同但不完全。我最大的愿望是拥有Area / Suburb - >城市/城镇 - >地区/省/州 - >国家。我可能正在尝试不可能的事情。

EDIT2: 对不起,我可能不够清楚,但我不需要邮政编码。只是郊区/区域名称 - >城市........

4 个答案:

答案 0 :(得分:1)

如果您想获取美国拉链信息,请查看Tiger。这是来自美国人口普查的信息,将为您提供所有数据。但是,需要注意的是,信息不易抽象,因此需要一些时间。

答案 1 :(得分:0)

这比第一次出现时更复杂。有些城镇有多个邮政编码。有些邮政编码有多个城镇。许多地址可以使用主要城镇或最近城市的名称。验证地址并非易事。

如果您想尝试存储邮政编码数据,可以购买zip code databases。但您可能会发现使用their tool对USPS进行验证更容易。

答案 2 :(得分:0)

如果您对邮政编码不感兴趣,也许您可​​以从Wikipedia获取所需内容。

答案 3 :(得分:0)

首先,这里有两个不同的东西:地理信息和政治/组织信息。 可以有共享的邮政编码,但地理上任何对象都完全位于另一个对象内。

当我们必须解决问题时,我们只需创建一个通用树结构,其中每个地理节点都引用了每个父节点。顶级节点(在我们的例子中是国家/地区)没有父引用。更重要的是,对于不同的国家,我们有不同的结构。唯一的要求是它必须是分层的。

之后,我们通过预先计算树遍历信息来加速地理查询。我们遍历树,计算遍历顺序并将其存储在地理节点中。在查询中进行简单的int比较之后,足以检查一个geo是否在另一个内部,依此类推。

同时,存储类似邮政编码信息的内容在此处看起来像并行数据结构,存储在不同的表中,并引用地理结构中的地理节点。