5

私の要件は、すべてのオブジェクトのすべての属性の変更に対して完全な監査証跡が保持されるデータ モデルです。オブジェクトの定義も流動的です。時間の経過とともに、新しい属性が現れたり消えたりする可能性があります。この監査証跡は元のデータベースとは別に存在するため、トリガーベースの監査モデルは機能しません。

リレーショナル データベースでは、1 つの大きな ATTRIBUTE_HISTORY テーブルを使用してこれを実装できます。このテーブルは、適切なタイムスタンプ フィールドと責任フィールドを使用して、各属性に対する個々の変更をすべて記録します。

私の質問: 新しいストレージ モデル (BigTable、HBase、CouchDB、RDF ストアなど) は、この目的で RDBMS よりも優れていますか?

4

6 に答える 6

3

データをどのように保存するかという問題は、他の問題の中でも、データがどのように使用されるかによって異なります。今のところ理解している単純なものを使用して、予想される負荷の可能性があるかどうかをテストすることをお勧めします。その後、必要に応じて改善を行います。

トリガーベースの監査システムに関する問題に関連して、データベースレベルで作業を行うことに設定されているように聞こえるので、1 つの提案があります。トリガーを使用してデータベース内のテーブルへの変更をログに記録し、テーブルの内容を一晩 (または頻繁に) 処理し、格納されている場所に監査証跡を作成し、データベース内のテーブルの内容を空にします。このようにして、データベース レベルで変更をキャプチャしながら、実際の監査証跡を別の場所に保存するという要件を満たすことができます。

于 2009-06-22T15:44:45.853 に答える
1

トリガーが別のデータベースを参照できない理由がわかりません。ただし、監査データベースが別のサーバーにあり、接続がダウンしている場合、そのデータベースが利用できない場合、すべての変更が失敗する可能性があります。しかし、私たちの監査はトリガーを介して行われており、別の監査データベースがあります。

于 2009-05-21T21:34:19.967 に答える
0

特定のデータベースパラダイムが、監査ログに関して他のどのパラダイムよりも優れていると見なすことができるとは思いません。これはロギングの問題であり、データストアにいくらか直交していると見なすことができるため、データモデルの問題ではありません。

そうは言っても、CouchDBは、古いバージョンのドキュメントを削除しないように構成できます。各ドキュメントにタイムスタンプと場合によってはユーザーフィールドを追加すると、この機能を使用して、データベースに保存されたすべてのオブジェクトの履歴全体を自動的に保持できます。これは、データベースで取得できる監査ログの初期設定が最も簡単な場合があります。

他の人たちに関しては、私は彼らがこれに関してどんな種類のサポートを持っているかもしれないかわかりません。

警告:

(また、データベース内のオブジェクトを削除しない戦略に従い、代わりにオブジェクトを削除済みとしてマークする必要があります)

(RDBMSの場合、最も簡単な解決策は、データベースで実行されたすべての挿入、更新、または削除ステートメントをタイムスタンプとユーザーフィールドを含むテキストフィールドに記録する単純なテーブルです。これはpostgresデータベースで一度実行しましたが、履歴を保持する)

于 2009-06-04T03:49:07.840 に答える
0

監査するテーブルの名前を保持するテーブルを作成します (例: AuditTable)。最小列は、TableName (varchar)、RandomValue (float) である必要があります。RandomValue が変化するたびに起動するトリガーを AuditTable に追加します。このトリガーの仕事は、AuditTable にリストされている各テーブル (TableName) の監査トリガーを動的に再作成することです。監査トリガー (テーブルごと) は、AuditRecord テーブルに挿入する必要があります。このテーブルは、テーブル名、主キー ID、アクション タイプ (INSERT/UPDATE/DELETE)、元のフィールド値、および更新されたフィールド値をキャプチャします。テーブル構造が変更された場合、AuditTable の RandomValue を単純に更新すると、トリガーが再生成されます。特定のテーブルのトリガーを自動生成するコードを記述する必要があります。

于 2009-06-04T18:05:11.547 に答える
0

このような監査証跡では、パフォーマンスが問題になります。私はキャッシュ (非常に耐障害性があります) を使用し、カウントが特定のしきい値 (たとえば 1000 レコード) に達したときにキャッシュの内容を永続化します。これは理想的にはバッチ更新です。

永続化オプション( H2 など)を備えたインメモリデータベースも同じことを行う必要があると思います。しかし、私自身は使用していません。

于 2009-06-05T08:56:04.533 に答える
0

アプリケーション コードでロギング システムを作成することもできます。データベースを変更するすべての関数への呼び出しをログに記録し、COMMIT を成功させます。

あなたの質問への答え: いいえ、RDBMS を使用してください。ログに対してクエリを実行する方が簡単です。

于 2009-05-16T15:40:18.980 に答える