我正在构建一个网站,它是一个根据几个用户首选项创建邮件合并(或多或少......)的应用程序。它可以毫无问题地生成笛卡尔连接价值的数据,但是企业的需求使生活变得更加困难......

我必须构建应用程序,以便在验证远程员工的邮政编码后,它根据媒体目标与该员工的距离创建发送到媒体目标的电子邮件。举例来说,员工是他们工作的地方众所周知的志愿者。该企业希望通过电子邮件向这些员工 5 英里半径范围内的媒体发送有关该员工正在从事的工作的消息。这就是事情变得混乱的地方......我在这里有几个选择,我将概述这些尝试和失败:

  1. 最大半径为20英里。我创建了一个数据库表,其中包含美国每个邮政编码的记录,并将该邮政编码连接到该邮政编码 20 英里范围内的每个邮政编码。数据集看起来像这样(名称不同,这是为了争论):
    sourcezip] | [城市] | [状态] | [CloseZip] | [城市] | [状态] | [距离
    失败:例如,纽约州有上述数据集中的 35 万条记录(其他州更糟!)。该页面的平均加载时间?6分钟...没有发生。我通过设置断点验证了这一点,断开连接是在 dataadapter.fill() 阶段发生的。

  2. (由于物流问题,这个从未实现)我为每个员工 zip 到媒体目标 zip 建立了一个数据库连接,距离为 x 或更小。只不过源文件和媒体目标组合起来可以达到 34k 份个性化电子邮件。34k 数据库连接?即使我可以设计出一种方法来重用邮政编码搜索,我也会在数据库中进行一些测试检查,发现员工工作的纽约有 500 个不同的邮政编码。500 个数据库连接?我怀疑这是否有效,但我可能会感到惊讶。

  3. 我解决这个问题的最新方案是希望网络服务器通过获取新的数据集来运行比 .net 数据集对象更好的游戏,如下所示:
    zip] | [经度] | [纬度
    然后计算距离公式来确定数据是否有效。这在很大程度上依赖于网络服务器上的处理器。这是一次值得的赌博,还是我会在这次尝试中发现相同的加载时间损害?

    有没有更好的办法?

    我感谢任何意见,即使它证实了我对这个项目的担忧 只是可能行不通.

补充笔记:我无法控制服务器,并且我正在运行 SQL2k :(。我正在 Visual Studio 2005、框架 2.0 中对该网站进行编程。不过,可能会在接下来的几个月内升级到 SQL2005 和 VS2008。

有帮助吗?

解决方案

如果您有一个员工数据集、一个媒体数据集以及一个源数据集和目标数据集之间的距离数据集,那么您可以节省一些将这 3 个表连接在一起的时间...

SELECT *
FROM Employees_List
   INNER JOIN 
       (Media_List INNER JOIN Distance_List ON Media_List.Zip = Distance_List.Target_Zip)
   ON Employees_List.Zip = Distance_List.Source_Zip
WHERE distance_Miles <=5

通过这种方式,您可以使用距离设置员工和媒体之间的关系。

其他提示

如果您有一个带有经度/纬度坐标的邮政编码数据库,您可以使用我的半正弦函数动态计算距离(请参阅我的 回答这个问题).

这在具有整个美国邮政编码数据的 Web 应用程序中表现良好。

该查询看起来类似于以下内容:

select * from zip where 
   dbo.udf_Haversine(zip.lat,zip.long, @lat, @lon) < 20   -- (miles)

您不会将此应用于每个收件人的地址,但您将首先确定您半径内的邮政编码(在嵌套查询中或使用 CTE),然后加入您需要将邮件发送到的所有地址。

编辑 经过调查后,半正矢函数的答案是我会采取的路线......它不像我们的数据库使用的功能那么密集(这将被修复:))

你应该 不是 每次都计算距离,从长/纬度到长/纬度是一个繁重的计算,如果你不止一次这样做,这是没有必要的。

话虽这么说,我不确定你为什么已经注销了选项#2。我们实际上正在做类似的事情。也许我对这些数字感到困惑,但是你提到的内容对于 SQL2k 来说应该没什么问题。

即使离线计算美国 zip 之间的距离,也只有大约 20 亿行。是的,它很多,但它大致是静态的,如果速度慢的话可能会被分片,等等。

如果您按 SOURCEZIP (ALTER TABLE ..MySQL 中的 ORDER BY (SOURCEZIP) )。应该只需要几分之一秒......ALTER 将花费很长时间(或者您可以按该顺序创建表)——但由于它是静态表,因此它毫无价值。

您使用的是 SQL 2008 吗?如果是这样,新的空间数据功能可能正是您在这里寻找的。您可以像在字符串上使用“LIKE”比较一样轻松地找到另一个范围内的坐标。

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top