3

私が構築しているサイトがあります。これは、いくつかのユーザー設定に基づいて (多かれ少なかれ...) 差し込み印刷を作成するアプリケーションです。デカルト結合に相当するデータを問題なく生成できますが、企業のニーズにより、生活を少し難しくする必要があります...

リモートの従業員の郵便番号を確認した後、その従業員からメディア ターゲットまでの距離に基づいて、メディア ターゲットへの電子メールを作成するアプリケーションを作成する必要があります。たとえば、従業員がよく知られているボランティアであるとしましょう。企業は、これらの従業員の半径 5 マイル以内にいるメディアに、従業員が行っている仕事に関するメッセージを電子メールで送信したいと考えています。ここで問題が発生します...ここにはいくつかの選択肢があります。試行と失敗の概要を説明します。

  1. 最大半径は 20 マイルです。米国内のすべての郵便番号のレコードを保持するデータベース テーブルを作成し、その郵便番号から 20 マイル以内のすべての郵便番号に結合します。データセットは次のようになります (名前は異なりますが、これは引数のためです)
    。[都市] | 【状態】 | [閉じる] | [都市] | 【状態】 | [距離]
    失敗: 例として、NY には上記のデータセットから 350,000 のレコードがあります (他の州はもっと悪いです!)。そのページの平均読み込み時間は? 6分... 起きていません。ブレークポイントを設定してこれを確認しました。切断が発生するのは dataadapter.fill() 段階です。

  2. (これはロジスティクスの問題により実装されませんでした) x 以下の距離で、各従業員 zip からメディア ターゲット zip へのデータベース接続を作成します。ただし、ソース ファイルとメディア ターゲットを組み合わせると、個別化された 34,000 通以上のメールに到達できます。34k DB 接続? 郵便番号検索を再利用する方法を考案できたとしても、DB でいくつかのテスト チェックを行ったところ、従業員が働いていた NY には 500 の異なる郵便番号があることがわかりました。500デシベル接続?それがうまくいくとは思えませんが、驚くかもしれません。

  3. この問題を回避するための私の最新のスキームは、次のような新しいデータセットを取得することにより、.net データセット オブジェクトよりも Web サーバーがより良いゲームを実行することを期待することです
    。[経度] | [緯度]
    次に、データが機能するかどうかを判断するために距離式を実行します。これは、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 とターゲット zip 間の距離用の 3 つ目のデータセットがある場合、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

EDIT調査後、Haversine関数の答えは私が取るルートです...それは私たちのデータベースが使用する関数ほど集中的ではありません(これは修正されます:))

毎回距離を計算するべきではありません。これは、経度/緯度から経度/緯度への重い計算であり、複数回実行する場合は不要です。

そうは言っても、なぜあなたがオプション#2をすでに取り下げたのかわかりません. これと似たようなことを実際に行っています。多分私は数字に混乱しているかもしれませんが、あなたが言及していることは、SQL2kが汗をかくために何もすべきではありません.

米国で zip から zip までの距離をオフラインで計算しても、約 20 億行しかありません。はい、たくさんありますが、大まかに静的であり、遅い場合はシャーディングされる可能性があります。

于 2009-03-25T02:26:55.183 に答える
-1

SQL 2008 を使用していますか? もしそうなら、新しい空間データ機能はまさにあなたが探しているものかもしれません. 文字列で「LIKE」比較を使用するのと同じくらい簡単に、別の範囲内の座標を見つけることができます。

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

于 2009-03-25T02:24:08.107 に答える