2

データベース テーブルの状態と Web サービス呼び出しの結果をすばやく比較する方法を探しています。

Web サービス呼び出しによって返されたすべてのレコードがデータベースに存在することを確認する必要があり、Web サービスの応答に含まれなくなったデータベース内のレコードはテーブルから削除されます。

問題を解決する必要があります:

  1. データ構造をデータベース テーブルの結果とすばやく比較するにはどうすればよいですか?
  2. 違いを見つけたら、新しいものをすばやく追加し、なくなったものを削除するにはどうすればよいですか?

1番は、データ構造をMD5にしてデータベースに格納することを考えていました。MD5 が異なる場合は、ステップ 2 に進みます。応答データをデータベースの状態と比較するより良い方法はありますか?

番号 2 についてさらにガイダンスが必要です。テーブルからすべてのレコードを簡単に取得し (SELECT * FROM users WHERE user_id = 1)、配列をループして、DB にないものを追加し、別の項目の配列を作成して削除することができます。その後の呼び出しですが、これを行うのがより良い(より速い)ことを望んでいます。データ構造をデータベース テーブルのサブセットと比較して同期する最良の方法は何ですか?

これらの問題についての洞察をありがとう!

4

2 に答える 2

1

時期尚早の最適化を行って自殺しないでください。各行を一度に 1 つずつ挿入する単純な方法を使用します。ループ中にテーブルのロックが長すぎるなどのトランザクションの問題がある場合は、最初に行を一時テーブルに挿入してから、実際の宛先テーブルに1回挿入することができます。

SQL Server を使用している場合は、一括挿入を行ったり、データを XML にパッケージ化したりすることができますが、最初に簡単な方法で実装してからテストし、本番データ (または同じ量のデータ) でテストできるかどうかを強くお勧めします。データ)、必要な場合にのみ最適化を検討してください。

于 2008-11-18T04:09:31.393 に答える
1

私は最近、同様の問題に巻き込まれました。私たちの非常に単純な解決策は、DB テーブルと同じ構造を持つテーブルに Web サービス データをロードすることでした。DB テーブルは最も重要な列のハッシュを保持し、同じハッシュ関数が Web サービス テーブルの対応する列に適用されます。

「同期」ロジックは次のようになります。

  1. DB テーブルに存在するハッシュを持つ行を Web サービス テーブルから削除します。これは、同期を必要としない重複データです。

    DELETE FROM ws_table WHERE hash IN (SELECT hash from db_table);

  2. Web サービス テーブルにないハッシュを持つ行を DB テーブルから削除します。

    DELETE FROM db_table WHERE hash NOT IN (SELECT hash FROM ws_table);

  3. Web サービス テーブルに残っているものはすべて新しいデータであり、DB テーブルに挿入する必要があります。

    INSERT INTO db_table SELECT ... FROM ws_table;

これはかなり強引なアプローチであり、トランザクション的に実行すると (ステップ 2 と 3 だけでも) DB テーブルがその間ロックされますが、非常に単純です。

改良の 1 つはUPDATE、ステートメントを使用して変更されたレコードを処理することですが、これにはかなりの複雑さが追加DELETEされ、INSERT.

別の可能な最適化は、行を削除する代わりにフラグを設定することです。行は後で削除できます。ただし、DB テーブルを使用するロジックは、フラグが設定された行を無視する必要があります。

于 2009-03-15T18:44:07.367 に答える