我有一个根据邮政编码搜索项目的应用程序。
在搜索邮政编码时,我会返回来自该城市/社区的所有产品(通过解析邮政编码完成)。
我现在需要根据与原始邮政/邮政编码的距离对这些产品进行分类。
我在数据库中存储了Lat / Long,并计划使用Haversine公式来计算与原始查询的apprx距离。
我的问题是,应该在哪里计算。 我应该在返回数据集之前在存储过程中执行此操作吗?
或者我应该使用我的Lat / Long返回我的数据集,并在返回用户之前计算它的服务器端。
可能需要执行最多1000次结果的计算。
答案 0 :(得分:3)
通常,数据库服务器是IO绑定的而不是CPU绑定的。 YMMV,但如果您的情况是典型的,则需要在DB服务器上执行Haversine计算。
我建议您为 arcsine 计算使用自定义查找表,因为您可以提供对数刻度的近似距离,例如:
> 30公里
然后使用线性插值作为细化。
对于单个都市区域遇到的典型距离,您可以考虑仅使用2个或3个API项,而不是更精确的计算:
回想一下,对于收敛的泰勒级数,第n个项之后的误差严格小于(n + 1)'st项的大小。这使您可以在达到所需精度后有效地终止计算,一般而言,由于地球不是均匀球体,因此Haversine公式仅为0.5%。
答案 1 :(得分:1)
您使用的是SQL Server 2008或更高版本吗?如果是这样,我建议使用内置地理数据类型而不是直接进行Haversine计算。您可以拥有一个包含邮政编码(例如90210)的邮政编码表,以及邮政编码的中心点或另一栏中邮政编码覆盖的整个区域(如果对您的申请有意义,则两者都有)。然后,您可以使用STDistance()
函数计算距离。此外,通过空间索引,您可以获得按距离排列的列表而无需太多精力。