投稿が長いことは承知していますが、私の問題に対する提案された解決策も含まれています。したがって、質問自体はそれほど長くはありません...怖がらないでください。:)
次のシナリオで私を助けてください:
データセットを保存する SQL サーバーを用意します。また、サーバーと同期する必要のある多数の PC クライアント (すべて独自のローカル SQL サーバーを持つ) も用意します。PC は一意に識別されます。
例:
PC1 と PC2 という 2 つの PC クライアントがあるとします。
サーバーには、次のデータセットがあります。
DS1 DS2
クライアント PC には、最初から何もありません。PC1 がサーバーに接続して "何か新しい" かどうかを確認すると、取得する必要があるデータセットが 2 つあることがわかり、ローカル データベースを DS1 と DS2 で更新します。PC2でも同じことが起こります。ここで、PC2 がローカルで DS2 を変更するとします。PC2 がサーバーに接続すると、サーバー上の DS2 がローカル DS2 に加えた変更で更新されます。最後に、PC1 が再度接続して変更があるかどうかを確認すると、DS2 が変更されていることがわかり、それを取得してローカルの DS2 をサーバーからの DS2 で上書きします。
すべての PC がデータ セットを変更できるわけではないため、同時実行の問題について心配する必要はありません。特定のデータセットの所有者のみがそれを変更できます (所有者は単一の PC として定義されています)。
いくつかの解決策を考えましたが、あまり効率的ではないようです。多分他の誰かがいくつかのアイデアを持っているでしょう。
最初の解決策:
サーバー上に「SyncTable」というテーブルを作成し、データ セットへの変更を書き込みます。
例:
PC1 が DS1 を取得する必要があり、PC2 が DS4 と DS5 を取得する必要があるとします。
同期テーブルには次が含まれます。
PC1 DS1
PC2 DS4
PC2 DS5
そのため、PC2 がサーバーに接続すると、このテーブルを見て、DS4 と DS5 をダウンロードする必要があることを認識し、先に進んでそれを実行し、サーバー テーブルから 2 つのエントリを削除します。したがって、PC2 がそれ自体を同期した後、サーバー テーブルには「PC1 DS1」のみが含まれます。次回、PC2 が接続すると、エントリがないことに注意し、「最新」であることを認識します。PC1 が接続すると、まったく同じことが起こります。DS1 をダウンロードし、ダウンロードしてから、エントリを削除する必要があることに注意してください。
これに関する問題は、10,000 台の PC があり、おそらく 5,000 個のデータセットが変更された場合、このテーブルに多くのエントリが作成されることです。
2 番目の解決策は、各データセットに関連付けられた変更されたタイムスタンプを保存することです。これに関する問題は、クライアント PC がすべてのローカル レコードを調べて、ローカルのタイムスタンプとサーバー上の最後のタイムスタンプを比較して、変更があるかどうかを確認する必要があることです。多数のレコードが与えられた場合、これがどれほど効率的かはわかりません。毎回すべてのレコードを調べるよりも、どこで変更を探すべきかを直接知っている方がよいようです...
したがって、これについて何か提案はありますか?
使用されるテクノロジー: クライアント PC では MS SQL Server Compact Edition 3.5、サーバーでは MySQL。通信は Web サービスを介して行われます。したがって、マージ レプリケーション/リモート データ アクセスはアウトです。
ありがとう!