RDBMS の概念モデルは、データの一時的なバージョンを維持するのにあまり適していません。したがって、この点で欠けているのはオラクルだけではありません。
バージョン情報をレコード レベルで保持するのが遅すぎると考える理由がわかりません。新しいバージョンの作成が遅すぎますか? または、通常の操作中にデータを取得するのが遅すぎませんか?
これがあなたがそれを行う方法です。CUSTOMER_REF のビジネス キーを持つテーブル CUSTOMERS を指定すると、通常は次のように作成できます (スペース上の理由から、ベスト プラクティスではなく省略構文を使用しています)。
create table customers
( id number not null primary key
, customer_ref number not null unique key
, name varchar2(30) not null )
/
バージョン化された同等のものは次のようになります。
create table customers
( id number not null primary key
, customer_ref number not null
, version_number number
, name varchar2(30) not null
, constraint whatever unique (customer_ref, version_number) )
/
これは、VERSION_NUMBER の現在のバージョンを null のままにして、アーカイブ時にのみ入力することで機能します。ルックアップには を含める必要がありますand version_number is null
。これは少し面倒で、作成する追加のインデックスに列を含める必要がある場合があります。
明らかに、すべてのバージョンのレコードを同じテーブルに保持すると、テーブルのサイズが大きくなり、パフォーマンスに影響を与える可能性があります。ここでは、Oracle のパーティショニング オプションが確実に役立ちます。また、来年の一連のデータを作成するための適切な方法も提供します。ただし、エンタープライズ ライセンスに追加料金がかかるため、高価なオプションです。 詳細をご覧ください。.
これで最も時間がかかるのは、新しいバージョンのテーブルで外部キーの関係を管理することです。合成主キーを使用することを選択したと仮定すると、アーカイブ プロセスは新しい ID を生成し、外部キーを参照する新しいバージョンの従属レコードにそれらを苦労してカスケードする必要があります。
このことを考えると、バージョンごとの目立たないテーブルは非常に魅力的に見えます。使いやすくするために、現在のバージョンにプレフィックスを付けないようにして、アーカイブが単純なプロセスになるようにします
create table customers_n as select * from customers;
バージョン対応表の作成中は、ダウンタイムを避けたい場合があります。その場合、具体化されたビューを使用して、アーカイブの切り替えまでの実行中にテーブルの状態をキャプチャできます。時計が 12 時を打ったら、リフレッシュをオフにすることができます。(注意: これはその場で考えているものです。私はこのようなことをしたことがないので、購入する前に試してください。)
複数のテーブル (およびパーティショニング) の適切な利点の 1 つは、アーカイブされたレコードを READ ONLY テーブルスペースに移動できることです。これは、不要な変更からそれらを保護するだけでなく、後続のバックアップからそれらを除外できることも意味します.
編集
アーカイブされたデータは時折修正される可能性があるとコメントしていることに気付きました。その場合、それを読み取り専用のテーブルスペースに移動することはうまくいきません。