データベースエントリ(データ)のバージョン管理を可能にする方法は何ですか?
記事の変更を元に戻すコンテンツ管理システムの機能を考えてみてください。
彼らの長所/短所は何ですか?
基本的に2つの方法があります。以前のすべての値が格納されている監査テーブル、またはテーブルの一部として開始/終了日を含める方法です。すべての更新では、古いレコードを閉じながら新しいレコードを作成します。
更新:SQL SERVER 2016はこれを設計パターン/テーブルタイプとしてサポートします— https://docs.Microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server -2017
1つのアイデアは、「挿入のみのデータベース」を使用することです。基本的な考え方は、行のデータを削除または更新しないことです。
追跡が必要な各テーブルには、2つのdatetime
列from
とto
があります。それらは、それぞれNULL
の値で始まります(時間の始まりから時間の終わりまで)。行を「変更」する必要がある場合は、新しい行を追加し、同時に前の行のto
をNow
に更新し、from
をNow
に追加する行。
詳細については、以下をご覧ください。
この手法はAuditTrail
と呼ばれ、レガシーデータを管理し、その変更履歴を保存します。
この性質の質問はすでに投稿されているようです:
各テーブルにトリガーを使用して_historyにデータを維持でき(または任意の名前を付けることができます)、メインテーブルで挿入、更新、削除を行うたびにトリガーがトリガーされ、このテーブルに詳細を保存できます。トリガーメカニズムSQLiteデータベースを使用している場合は、それも使用できます。
このメカニズムは、大規模なプロジェクトにも役立ちます。このテーブルでは、変更を行ったユーザーの情報と、変更のタイムスタンプを記録できます。その後、要件に一致する任意のタイムスタンプにテーブルを復元できます。
すべてのデータベースには、トリガーを記述およびコーディングする独自の方法があります。 SQLiteを使用している場合は、構文について SQLite.org にアクセスしてください。その他のデータベースについては、公式サイトをご覧ください。
あなたはおそらく Sqlite dbエンジンを知っています。データベース全体が1つのファイルに保存されます。このAPIは仮想ファイルシステムもサポートしているため、基本的にはどこでも、どのような形式でもストレージを整理でき、特定のファイルオフセットでの読み取りおよび書き込み操作に応答するだけです。これに使用できるアプリケーションは、暗号化、圧縮などです。コンテナーレイヤーがデータベース、sqlまたはsqliteファイル形式について何も認識していないことが最も重要な部分であり、xReadおよびxWriteコールバックに従うだけです。
アイデアの1つは、タイムマシン機能を実装することでした。そのため、xWrite操作では、「元に戻す」履歴で上書きされるすべてのセグメントが保存され、ユーザーは過去の日付を選択して、データベースに何が含まれているかを確認できます(おそらく読み取り専用モード)。まだ実際の例はありませんが(sqliteメールリストに ディスカッション についてありました)、おそらく他のエンジンがVFS APIを提供しているため、同様のことが可能です。そして、それが実装されると、どんな複雑なデータベース構造とも互換性を持つはずです。
データベースエントリのバージョン管理に使用する方法は、監査テーブルを使用することです。テーブルには次のようなスキーマがあります。
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
次に、追跡するテーブルの挿入/更新/削除のトリガーがあります。
長所:
短所:
私はこれのバージョンを今やっています。すべてのレコードについて、挿入日、変更日、アクティブレコードのブールフラグがあります。最初の挿入では、挿入日と変更日は両方ともNow()に設定され(この例はAccessにあります)、アクティブレコードフラグはtrue
に設定されています。次に、そのレコードを変更する場合、すべてを新しいレコードにコピーし、ユーザーが変更するフィールドを変更します。挿入日を元の日付のままにし、変更日をNow()に変更します。次に、元のレコードのアクティブレコードフラグをfalse
に、新しいレコードをtrue
に切り替えます。元のレコードのIDを保存するModifiedRecordsParentIDのフィールドもあります。
次に、クエリを実行する必要がある場合でも、ActiveRecord = true
と私は最新の情報のみを取得します。
また、時間の経過とともにDBへのすべての変更を保存する場合は、ロギングをチェックすることをお勧めします( https://stackoverflow.com/questions/3394132/where-can-i-find-the-mysql -transaction-log )