0

データベースを設計しようとしていますが、変更履歴を追跡できるようにしたいと考えています。

食品のすべての栄養成分を記載した表を作成します。ユーザーがアイテムに変更を加えたとき (カロリーを 100 から 200 に変更したとします)。それを新たなリビジョンとして作りたい。

そうすれば、最初の 100 カロリーが 200 カロリーに更新されたことがわかります。これは、編集されたものを確認できるスタックの方法によく似ていると思います。

これを行う最善の方法は何ですか?私はSQLサーバーとnhibernateを使用しています。

リビジョン番号となる別の列または何かを考えていました。その後、改訂が行われるたびに番号が増分されます。これは良い方法ですか?

4

3 に答える 3

1

NHibernate.Enversはそれを支援します。

于 2013-02-04T09:21:49.337 に答える
0

書いたとおりに、別のリビジョン番号を追加することができます。

別のアプローチは、タイムスタンプを追加し、それを履歴として使用することです。アイテムが更新されるたびに、現在の値と現在のタイムスタンプを含む行を追加します。

于 2013-02-04T00:04:53.110 に答える
0

私は通常、これを処理するために何らかの形式の監査テーブルを使用します。私が現在働いている場所では、すべての監査テーブルを監査スキーマの下に置き、リビジョンを追跡したいすべての監査テーブルを用意しています。NHibernate は使用しないため、トリガーを使用して、特定の行に対するすべての更新がタイムスタンプとユーザー ID とともに監査テーブルに記録されるようにします。これにより、リビジョンが行われた方法のコンテキストと順序を取得できます。作る。

NHibernate でトリガーを使用するのは難しいようですが、この投稿で説明されているように、NHibernate インターセプターまたはイベントのようなものを使用できます。コードに依存するよりもトリガーの方が望ましいと思いますが、これが NHibernate を使用する唯一の方法である場合は、一見の価値があるかもしれません。

最後に、SQL Server のネイティブな監査またはトレース機能を使用できると述べているのを見てきました。私はこれを自分で使用したことはありませんが、SO に関するいくつかの投稿を覚えています。これは、独自の手動監査テーブルと関連するトリガーを作成する必要性を置き換えることを示唆しています。上記のリンクからのこの引用に示されているように、あなたが望むことをしているようです。

データベース オブジェクトに対するユーザー、ロール、またはグループのアクティビティの監査は、テーブル レベルまで制限できます。つまり、SQL Server 監査をターゲットにして、1 人または複数のユーザーの特定のアクティビティを個々のテーブル レベルまで追跡できます。たとえば、SQL Server 監査では、DBO による Payroll テーブルへのすべての更新のレコードを作成できます。

私には、単なる改訂履歴というよりも真の監査のように聞こえますが、この分野の経験が豊富な人なら、改訂追跡に使用できる可能性についてコメントできるかもしれません。もちろん、それが NHibernate に与える影響も確認する必要があります。

于 2013-02-04T02:07:48.087 に答える