まず、Visual Studio 2010、.Net 4、SQL Server 2008 R2 (および C#) を使用しています。
現在、古いアプリケーションを .Net に移行しています。実際、それは完全な書き直しです。
アプリケーションはサーバー クライアント セットアップであり、「たまに接続する」という説明に完全に適合します。
標準的なインストールには、10 台のクライアントと 1 台のサーバーが含まれます。クライアントは、データベースから半静的データのプールにアクセスしています (これをコアデータと呼びましょう)。
クライアントはまた、毎日さまざまな新しいエントリ (約 700 から 800) を別のテーブルに追加します。これを「投稿」と呼びましょう。
ここで、次の 2 つの目的でローカル データベースをキャッシュとして使用します。
当社の主な顧客の場合、コアデータは約 200000 エントリで構成され、毎日約 100 の変更があります。このデータにすばやくアクセスする必要があるため、このデータをクライアントにキャッシュしたいと考えています。
他のいくつかの小規模な顧客については、専用サーバーを実行していません。クライアント マシンの 1 つがこのジョブを実行しています。ユーザーが「サーバー」をシャットダウンすると、クライアントは新しい投稿を保存できなくなります。これは実際には深刻な問題であり、非常に頻繁に発生します (トレーニングを受けていないユーザー)。これにはある種のキャッシュが必要です。
さて、Visual Studio 経由で追加できるローカル データベース キャッシュについて読みましたが、既に試してみました。
理論的には、これはまさに私たちが必要としているものです。しかし、実際にはいくつかの困難に遭遇しました。
ローカル キャッシュ DB を作成するときに、外部キーの関係がローカル DB にないことに気付きました。これは「意図したとおりに機能する」と文書化されていることがわかりましたが、それらを適切に含める方法についての指示を見つけることができなかったので、ローカル DB でそれらを信頼でき、引き続き同期できます。
自分でリレーションを追加した後も、同期の問題が発生しました。
テーブル A とテーブル B の 2 つのテーブルがあります。テーブル A に 1 つのエントリを追加し、テーブル A のエントリを参照してテーブル B に 30 のエントリを追加しました。
同期すると、テーブル A は正しく同期されました - テーブル B ではエントリが同期されませんでした。
テーブル B にさらに 30 エントリを追加し、再度同期を試みました。今回は最初の 30 エントリを無視し、新しい 30 エントリのみを同期しようとしました。それらのうち、1 つだけが正常に同期されました。ここで明らかに何かが欠けています。
純粋に理論的な質問: 同期は「アップロードのみ」、「ダウンロードのみ」などにすることができます。必要なのは「投稿のみ」のようなものです。セットアップ全体を機能させることができなかったため、自分でテストせずにこの質問を追加します。
「アップロードのみ」を同期し、同期後にローカル DB からすべてのエントリを消去するとどうなりますか? 次回の同期時にサーバーからエントリを削除しますか? はいの場合、同期サービスをこの目的で引き続き使用できますか、それとも DataSet を使用して手動でエントリをサーバーに送信する必要がありますか?