3

私のタイトルがはっきりしないかもしれません。Subversionがファイルに対して行うように、wikiが行うように、データベーステーブルに対するある種のバージョン管理を探しています。

変更ログをトレースしたい。差分を逆に抽出して実行したい。(「svn merge -r 101:100」のように元に戻します)。履歴のインデックス検索が必要になる場合があります。

「アンドゥ エンジンのデザイン パターン」を読んだことがありますが、「パターン」に関するものです。車輪を再発明せずに再利用できるものはありますか?

編集: たとえば、銀行口座取引。テーブルで更新された列「残高」(およびその他) があります。ユーザーは 10 日後に間違いに気づき、他のトランザクションを変更せずに、特定のトランザクションをキャンセル/ロールバックしたいと思うでしょう。

アプリケーションレベルで優雅に行うにはどうすればよいですか?

4

7 に答える 7

3

Martin Fowler は、時間とともに変化するもののパターンでトピックをカバーしています。まだパターンであり、実際のフレームワークではありませんが、彼はサンプル データとその使用方法を示しています。

于 2008-12-09T15:19:19.943 に答える
3

追跡するレコードごとにリビジョン アプローチを使用できます。これには、レコードのリビジョンごとにテーブルに行を保持することが含まれます。レコードは共有「ID」によって結び付けられ、「リビジョン ステータス」で照会できます (たとえば、最新の「承認済み」レコードを取得します)。

アプリケーション層では、必要な情報をすべて記録している限り、これらのレコードを個別に処理し、必要に応じて以前の状態にロールバックできます。

[ID] [Revision Date] [Revision Status] [Modified By] [Balance]
1     1-1-2008         Expired           User1         $100
1     1-2-2008         Expired           User2         $200
2     1-2-2008         Approved          User3         $300
1     1-3-2008         Approved          User1         $250
于 2008-12-09T15:40:07.140 に答える
1

衒学的な点。あなたの銀行口座の例は、監査人/規制当局を通過しません。

アカウントに誤ったエントリがあった場合は、記録のために残しておいてください。同等かつ反対の修正トランザクションがアカウントに適用されます。実際には、元のトランザクションをロールバックしますが、元のエラーとその修正の非常に明白な痕跡を残します。

于 2008-12-09T15:05:04.307 に答える
1

私はバイテンポラル データベース設計を採用します。これにより、実行とロールバックに必要なすべてのデータが提供されます。これは、行をさらに挿入することを意味するか、後の変更を単に削除することを意味します。

このようなデータベース設計にはかなりの微妙な点がありますが、このテーマに関する非常に優れた本があります。

リチャード T. スノッドグラスによる SQL での時間指向データベース アプリケーションの開発

ここからダウンロードできます:

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

データベースにロックが作成されるため、データベース トランザクションを使用することはお勧めできません。基本的に、データベース トランザクションはできるだけ短くする必要があります。

アプリケーション層にあるものは、それ自体に何らかの永続化メカニズムがない限り、アプリケーションの再起動後は存続しません (ただし、それは要件ではないかもしれません)。

于 2008-12-09T17:02:34.913 に答える
0

さまざまなコメントに基づいて、問題の可能な解決策は、「有効な日付」テーブルを作成することです。

基本的に、有効開始日列と有効終了日列をすべてのテーブルに追加します。

「現在の」レコードは、常に「2999-12-31」または任意の高い値の valid_to_date を持つ必要があります。値が変更されると、「有効終了日」を現在の日付に変更し、有効開始日が今日で有効終了日が「2999-12-31」の新しい行を挿入します。変更されていない場合は、古い行の列。

「select all-columns-except-valid-xx-date from table where valid-to-date = '2999-12-31'」でビューを作成できます

これにより、現在のすべてのクエリを変更せずに機能させることができます。

これは、データ ウェアハウス環境や、発効日が重要な為替レートなどで非常に一般的な手法です。

元に戻すロジックは明らかです。

于 2008-12-10T10:07:16.793 に答える
0

トリガーと行バージョンを使用する前に完全な元に戻す/監査の履歴を設定しましたが、特定のパターンは認識していません。

ログを調べて実際の変更を確認できる MS Sql 用のアプリがいくつかあります。

Log Navigator と呼ばれるものを MS SQL 2000 で使用して、特定の履歴トランザクションを元に戻すことができましたが、今は見つかりません。

http://www.lumigent.comhttp://www.apexsql.comはログを表示するためのツールを提供していますが、どちらもログをロールバックできるとは思いません。

これを行うための最良の方法は、これを念頭に置いてアプリケーションを作成することだと思います-これを行う方法について、ここですでにいくつかの良い提案があります。

于 2008-12-10T10:20:16.580 に答える
0

James Anderson へのコメントに基づいて、トランザクションをキャンセルするときにユーザー インターフェイスに新しい挿入を書き込むようにします。値が正の数ではなく負の数になることを除いて、キャンセルされたトランザクションと同じ値を持つ新しいレコードがテーブルに挿入されます。トランザクションの目的を定義するための何かを含む構造がある場合は、キャンセルされ、キャンセルされたトランザクションのレコード番号が表示されます。

于 2008-12-09T16:05:51.953 に答える