質問

私が話していることはすべて、リレーショナルデータベース、特定のMySQLに関連しています。

データベースにはいくつかのテーブルがあり、中程度の数のテーブルのために、レコード値が変更されたときに履歴を保存したいと思います。私はこれがいくつかの異なる方法で行われているのを見てきました:

  1. 1つのテーブル/1つのフィールド - 基本的に、履歴ストレージが必要なすべてのテーブルの履歴を保存するテーブルが1つあります。すべての変更は、テキストデータ型として1つのフィールドに記録されます。
  2. テーブルあたりのテーブル/1つのフィールド - 各テーブルには独自の履歴テーブルがあります(つまり、プロジェクト/プロジェクト構造、問題/問題など)。
  3. テーブルあたりのテーブル/フィールドあたりのフィールド - これは各テーブルの上記のようなものですが、履歴テーブルには、追加の履歴関連フィールドが追加された通常のテーブルとほぼ同じ定義があります(updatedateTime、updateuserid、updateuserid、等...)。

記録履歴を保存するこれらのさまざまな方法の利点と短所は何ですか?私が考えていない他の方法はありますか?

役に立ちましたか?

解決

さまざまな数の列があるテーブルがたくさんあるので、すべての列の集合体とたくさんのヌルを備えた巨大なテーブルがあるので、#1が出ます。

#2&#3の間に、管理したいデザインの複雑さに関して決定する決定があると思います。私の見解では、特定のテーブルの正確なアーカイブレプリカを維持し、RowState全体(変更された時間付き)を保存する方が簡単だということです。行の複数の列を更新する場合を考えてください。その場合、#2は、同じトランザクションであっても、列の変更のエントリを個別にログに記録します。複雑さを減らし、タイムロウの状態を獲得するためにW#3に行きます。

他のヒント

あなたは本当に最初に読みたいです:

http://www.cs.arizona.edu/~rts/tdbbook.pdf

あなたの歴史を別のテーブルに保持したい場合(そしておそらくあなたがそうする)、おそらくオプション#3が必要になるでしょう。実装が容易で、より便利な傾向があります。

ある程度は、そのデータをどのように使用するかに依存します。これが厳密に使用されている監査表である場合、時々何を変えたか、時には悪い変更を復元することを研究できる場合、オプション2は問題ありません。アプリケーションまたはレポートを通じてユーザー履歴を表示する場合は、オプション3を使用する場合は、ブロッキングが発生する場所にあるため、オプション1を使用する状況を考えません。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top