6

我的数据库中有一个记录列表,每条记录都与一个邮政编码相关联。

查询数据库中的所有记录以查找另一个邮政编码 n 英里范围内的所有条目的“最佳实践”是什么?

每个邮政编码在数据库中都有一个与之关联的纬度/经度,所以我知道我必须使用它。但是,我无法想象在每对邮政编码上运行任何类型的距离公式,转换为英里并拒绝那些不在我半径范围内的。

对于这样一个常见的查询,这似乎在计算上非常昂贵。

我也考虑过进行全对预计算,但它似乎也太大而无法考虑。美国大约有 40,000 个邮政编码。因此,每个邮政编码的所有配对数据库将是 (40,000)^2,即 16 亿个条目。

我知道这是网站上的一个常见问题,所以希望有人可以为我指明正确的方向以找到最佳方法。我正在使用SQL Server 2008,如果有预构建的解决方案,那就太好了,因为我真的不想在这种情况下重新发明轮子。


相关问题:获取半径内的所有邮政编码(这对我没有帮助)
另外,我知道这个SourceForge项目,但它已被遗弃且不再使用。

4

4 回答 4

7

我将运行一个查询,返回包含在包含径向搜索圈的方形信封中的所有记录(minlat < lat < maxlat 和 minlong < long < maxlong),然后对其进行后处理以仅返回半径圈内的点本身。(确保您的 lat 和 long 字段已编入索引)。

如果你想花点心思,SQL Server 支持空间索引

于 2009-02-09T10:04:21.680 回答
3

我运行一个站点,该站点需要每个用户每秒运行一次此查询,这就是我所学到的:

首先,确保您的位置表具有纬度和经度的索引。如果您有数百万条记录,这就是 20 毫秒和 15 秒响应时间之间的差异。

从边界框查询开始,以获得一组可使用的位置。然后计算这些距离,排序,如果你对准确性很挑剔,过滤掉一些。

坦率地说,我不会担心预先计算任何东西。就像我说的,我对一个有 6,000,000 个条目的位置表运行这种类型的查询,它通常会在 <50 毫秒内返回结果。根据您的需要,这确实足够快。

祝你好运!

于 2009-02-09T20:21:30.543 回答
0

这实际上是一个非常难以解决的问题。我建议您通过预先创建数据库来进行一些作弊。创建一个您需要找到的任何类型的网格,例如,在每个方向上每 10 英里,为该网格点和距离的每个 zip 添加一个条目到数据库中,然后当查询进来时,您首先将查询点转换为您的一个网格点。现在你可以很容易地查看距离。

这种解决方案基本上意味着以空间换时间,因此您可以快速获得一个相当大的数据库。好消息是:索引数据非常容易。

于 2009-02-09T09:27:05.157 回答
0

您应该查看GeoNames.org。您可以查询他们的网络服务以查找您要查找的内容,或者您​​可以访问他们的数据库。

于 2009-02-09T20:38:17.353 回答