0

私はいくつかの入力を探しています。マルチユーザー、マルチベンダー、n 層データベース アプリケーションを設計しています。

このシステムの各ローカル インストールは、そのレコードを単一の中央サーバーに複製する必要があります。このサーバーは、インストールされたデータベース アプリのユーザーが直接利用することはできず、インターネットが唯一のルートです。中央データベースはレポートにのみ使用されるため、レプリケーションは中央サーバーへの一方向のみで済みます。

主な目的は、「疑似リアルタイム」スナップショットを確保するために、レコードをできるだけ早く中央データベースに取得することです。

ここに私がこれまでに持っているものがあります:

  1. インターネット上のWebサーバー(SOAPサービス)を利用して圧縮・暗号化ファイル(XMLデータ)をアップロードします。「中央」データベース サーバーは Web サーバーをポーリングし、定期的にデータを収集してインポートします。

  2. ローカル データベース システムはレコードを削除しませんが、削除済みとしてマークします。

  3. データベース内の各テーブルには、中央データベースでのキー違反を防ぐために、GUID のような代理キー (つまり、auto-inc フィールドなし) を使用する主キーがあります。

  4. クライアントの db サーバーを使用して抽出およびアップロード プロセスを実行することを割引しました。これは、顧客のサイトでこのシステムの IT サポートがほとんどないためです。アップロードが失敗した場合 (ローカル ファイアウォール/プロキシ サーバーの問題が原因で)、ユーザーが必要です。彼らがそれを整理できるように、できるだけ早く知るために。

  5. 抽出プロセスは、変更を抽出するためにローカル データベース全体にクエリを実行するため、一度に 1 つのクライアント アプリケーションで実行するだけで済みます。

私が苦労しているのは、最近変更されたレコードを効率的に (そして正確に) 抽出できるようにするためのデータベース構造です。また、これはユーザーが作業しているときにも発生します。つまり、ユーザーが抽出中にレコードを編集用に開いていることに注意する必要があり、ユーザーの作業をあまり中断しないように「バックグラウンドで」実行する必要があります。

つまり、日付と時刻に基づくアプローチを使用しますか? ある種のステータス フィールドを使用するか、クエリしてからクリアできる別の変更ログ テーブルを使用するか。

長い投稿で申し訳ありませんが、このソリューションの開発に関して誰かが経験したことを高く評価します。

ティア、

スチュアート

4

1 に答える 1

0

Slony for PostgreSQL がどのようにそれを行うかを見てみたいかもしれません。

事実上、変更について実際のテーブルにクエリを実行する代わりに、テーブルのトリガーを使用して、変更されたデータを別のログ テーブルに記録します (これらの挿入/更新/削除)。次に、ログ テーブルの増加するフィールド (トランザクション ID、時間など) を使用して、前回以降の変更のみを取得し、すべての関係者がログ エントリを取得したらログ エントリを削除するのは簡単です。これにより、元のテーブル (およびそのクライアント) を変更して、存在するが論理的に削除された行を理解するという 2 番目のポイントも削除されることに注意してください。

もちろん、データベース エンジンによっては、問題を複雑にする詳細がいくつかあります。オリジナルのSlony 設計ドキュメントは、問題点と、なぜこのように動作するのかをうまくカバーしています。PostgreSQL を使用していない場合でも、一読の価値があるでしょう。

于 2009-01-15T18:06:41.140 に答える