【发布时间】:2011-04-28 08:29:25
【问题描述】:
这是一个比我迫切需要的问题更具挑战性的问题,所以不要整天花在这上面。
我在 2000 年左右建立了一个约会网站(早已不复存在),其中一个挑战是计算用户之间的距离,以便我们可以在 X 英里半径范围内展示您的“匹配”。仅说明问题,给定以下数据库架构(大致):
用户表 用户身份 用户名 邮政编码
邮政编码表 邮政编码 纬度 经度
在 USER.ZipCode = ZIPCODE.ZipCode 上加入 USER 和 ZIPCODE。
您会采用什么方法来回答以下问题:哪些其他用户居住在位于指定用户邮政编码 X 英里范围内的邮政编码中。
我们使用了2000 census data,其中包含邮政编码及其大致纬度和经度的表格。
我们还使用Haversine Formula 来计算球体上任意两点之间的距离...非常简单的数学运算。
问题,至少对我们来说,作为 19 岁的大学生,真正变成了如何有效地计算和/存储所有成员到所有其他成员的距离。一种方法(我们使用的方法)是导入所有数据并计算从每个邮政编码到每个其他邮政编码的距离。然后你会存储和索引结果。比如:
SELECT User.UserId
FROM ZipCode AS MyZipCode
INNER JOIN ZipDistance ON MyZipCode.ZipCode = ZipDistance.MyZipCode
INNER JOIN ZipCode AS TheirZipCode ON ZipDistance.OtherZipCode = TheirZipCode.ZipCode
INNER JOIN User AS User ON TheirZipCode.ZipCode = User.ZipCode
WHERE ( MyZipCode.ZipCode = 75044 )
AND ( ZipDistance.Distance < 50 )
当然,问题在于 ZipDistance 表中会有很多行。它不是完全不可行,但它确实很大。此外,它还需要对整个数据集进行完整的前期工作,这也不是不可管理的,但不一定是可取的。
无论如何,我想知道你们中的一些专家可能会采取什么方法来处理这样的事情。此外,我认为这是程序员必须不时解决的一个常见问题,尤其是当您考虑算法相似的问题时。我对一个彻底的解决方案感兴趣,该解决方案至少包括所有部分的提示,以便真正快速有效地结束。谢谢!
【问题讨论】:
标签: database gis geocoding distance zipcode