3

我有一个正在构建的站点,它是一个基于几个用户偏好创建邮件合并(或多或少......)的应用程序。它可以毫无问题地生成笛卡尔连接价值的数据,但是企业需要让生活变得更加困难......

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

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

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

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

    有没有更好的办法?

    我感谢任何意见,即使它证实了我对这个项目可能无法工作的担忧。

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

4

5 回答 5

2

如果您有一个带有经度/纬度坐标的邮政编码数据库,您可以使用我的 Haversine 函数即时计算距离(请参阅我对这个问题的回答)。

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

查询类似于以下内容:

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

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

于 2009-03-25T02:20:22.143 回答
1

如果您有员工数据集、媒体数据集以及源和目标 zip 之间距离的第三个数据集,则可以节省一些时间将 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

这样,您可以使用距离设置员工和媒体之间的关系。

于 2009-03-25T15:33:06.887 回答
0

编辑经过调查,Haversine 函数的答案是我将采取的路线......它不像我们的数据库使用的函数那样密集(这将是固定的:))

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

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

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

于 2009-03-25T02:26:55.183 回答
0

如果您在 MySQL 中按 SOURCEZIP (ALTER TABLE .. ORDER BY (SOURCEZIP) ) 对表和索引进行排序,则选择 350K 行(您的示例为 NY)将不会花费 6 分钟。它应该只需要几分之一秒...... ALTER 将需要很长时间(或者您可以按该顺序创建表)——但由于它是一个静态表,因此毫无价值。

于 2009-03-26T18:45:35.760 回答
-1

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

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

于 2009-03-25T02:24:08.107 回答