2011-06-04 9 views
1

私は、複数のソースのデータが、変更または更新されたときに他のソースのデータを上書きする必要があるディレクトリを設計しています。いくつかのデータベースはMySQL、SQL Serverであり、情報の一部はAD/LDAPになります。データベース間の情報同期を行う方法は?

私の質問はこれです:トラフィックを減らし、エラーを防ぐために、このタイプのデータベース伝播のためのデザインパターンはありますか?また、このプロジェクトはPHPで行われるので、誰かが同じようなオープンソースプロジェクトを知っていれば、私はそこから順応することができます。おそらく、いくつかのデータベースの間に何らかの論理がなければなりません。

+1

[MySQLレプリケーション](http://dev.mysql.com/doc/refman/5.5/en/replication.html)が必要ですか? – Nemoden

+0

@Nemoden not quite。うまくいけば、ほとんどのデータは同様のフォーマットになりますが、これらのデータベースはさまざまな理由(時間と財務とインターネットのディレクトリ)で設計されているため、データの場所に関するかなりのルールを追加する必要があります。私はいくつかのデータベースレベルのものをやってみたいですが、SQL Serverベースのものは、フィールドが常に同じではないなど、部分的には簡単ではありません。試行された情報の変更を記録しながら、簡単にルールを作成したり、チェックを追加する(電子メールの送信など)。 – Sean

答えて

1

同期するレコードにフラグを設定する方法が必要です。このようなシステムでは、同期する各テーブルに同期状態を保持する列があります。レコードが変更されると、その状態も(トリガーで)変更され、同期ツールは数分ごとに変更されたレコードを照会します。

この問題を正しく処理するには、特にレコードを直接削除できないため、多くのコードが必要になります。同期ツールは、最初に実際の削除を実行する必要があり、それを必要とします。それだけでなく、このように良いキューを作成するのは難しいので、レコードが親の前に同期されていればエラーになります。また、同期する必要があるすべてのテーブルには追加の列が必要です。

これで、実装しようとしている新しいソリューションがあります。このソリューションでは、キューに別のテーブルを使用します。キューには、他のテーブルのレコードへのポインタ(プライマリキー値とテーブル名/フィールド名への参照)が含まれています。このキューは変更を監視する唯一のテーブルであるため、変更されたレコードをキュー内で変更されたものとしてマークする単一のトリガを実装するだけです。これは別のテーブルの単一のキューであるため、前述の問題の解決方法が追加されています。

  • すぐにレコードを削除できます。同期ツールはキュー内のIDを見つけ、それが存在しないことを確認して他のデータベースからも削除します
  • 子の親の依存関係は自動的に解決されます。新しい親はその子の前にキューに入れられ、削除された親はその子の後ろに置かれます。クロスリンクされたレコードで見つかるかもしれない唯一の問題ですが、遅延コミットがその解決策になるかもしれません。
  • すべてのテーブルに余分な列は必要ありません。単一のキュー、いくつかのヘルパー・テーブル、および単一のファンクション・コールを含む単一のトリガーで、同期する各表に対してのみコールされます。

残念ながら、私たちはこのソリューションを完全に実装していないため、実際にはうまく機能するかどうかはわかりません。

このシステムはレコードの1つに1つのコピーを作成します。私はそれも最高の承認だと思う。データをコピーしてから、ターゲットサーバーで(後で)処理します。私はそれをコピーしながらデータを処理することは良い考えではないと思います。何かがうまくいかない場合、データのデバッグと復元/再計算を行うことができます。

+0

+1ありがとうございます、あなたの答えは非常に明るいです。1つの質問ですが、このキュー・スキームでプログラムが作成しなかったデータベースの変更をどのように監視しますか?例えば。別のプログラムがデータベースを変更します。あなたのプログラムのキューは、これが起こったことをどのように知っていますか? – Sean

+0

すべてのテーブルを同期する必要があります。これらのトリガーは、変更が発生したソースに関係なく、データが変更されたときに自動的に呼び出されます。したがって、トリガーが設定されると、プログラムで何もする必要はありません。 – GolezTrol

+0

私は参照してください。ありがとうございました。 – Sean

関連する問題