2009-08-13 7 views
4

私は書籍を持つデータベースを持っています。バージョントラッキングwith mysql

1冊の著者には1人の著者、出版社があります。 いくつかの価格、IDと説明。

1つの製品の変更を追跡したいと思います。 1つの方法は、時間AND IDを主キーとして製品を保存することです。

他の方法はありますか?

変更を自動的に追跡できるデータベースシステムがありますか(私はmysqlのみ使用しています)?

挨拶...

答えて

1

あなたは「更新」イベントをキャッチし、「ログイン」テーブルに関連する情報の束を入力する(MySQLがそれらを持っている場合、私はそれがないと思う)トリガを使用することができます。

データベースにはトランザクションログがありますが、おそらくそれはあなたには些細なことではないと思うので役に立たないでしょう。

1

簡単な解決策は、変更された日付を商品テーブルのフィールドとして含めることです。

ストアドプロシージャを更新して、常に最新の有効期限の製品IDで製品を引き出します。

これにより、製品のすべてのバージョンをリストする個別のストアドプロシージャを作成できます。

+0

これの変種は、 'active-from'と' active-to'の2つのカラムになります。将来の製品/オファー/などをキューに入れることができます。 –

4

1つのアプローチは、2つの別個のテーブルを有することである。 booksおよびbook_versionsには、同じフィールドセット(作成者、発行者、説明など)が含まれています。

アプリケーションがbooksに挿入または更新すると、対応するレコードがbook_versionsに挿入されます。つまり、booksテーブルには最新バージョンのレコードが含まれ、book_versionsには最新バージョンとすべての履歴バージョンが含まれます。あなたが最新バージョンに興味があるのならば、IDで書籍を選択し、必要なときだけ履歴を取得することができます。これは、Ruby on Rails用のacts_as_versionedプラグインで使用されているアプローチです。

1

あなたのシステムにchangelogテーブルを追加することを提案します。この表はこれまでに書かれたもので、date、subject、predicate、objectという列があり、subjectは変更を行う著者/プリンシパルであり、predicateは変更の性質(作成、更新、削除)であり、objectは物事は変化している。潜在的にオブジェクトをID、属性、値に分割することができます。idはブックID、属性は変更される属性の文字列名、値はの値です(新しいものは適切なテーブルにあります) )。

1

上記のいずれかの解決策が有効です。それは実際にあなたのワークロードとデータセットのサイズに依存します。

レコードがたくさんあり、過去のアーカイブを参考にしたい場合は、「古い/以前の」バージョンをデータベースから移動して、何らかのリンクリスト形式(例:以前のバージョンのアドレスを含むバージョンを挿入し、リンクされたリストを作成する)、最新のバージョンへのポインタをDBに保持するだけです。

このアプローチではプラスとマイナスがありますが、1つは、DBを小さくしてディスクから古いバージョンを読み取ることができます。あなたの古いバージョンは不変でなければならないので、DBからのトランザクション/並行性サポートに頼る必要はありません。あなたの「最新の/最新の」データセットが100Gと言い、過去のバージョンが900Gであれば、100GのRAIDにデータベースを置き、過去のバージョンをより安価なストレージに置くことができます。 (アトミックなので、複製時に並行性の問題はありません)。