つまり、基本的にこれは「DB 内のテキスト情報をバージョン管理する方法」です。
最も簡単な方法は、単にデータをコピーすることです。
単純に、データの「古いバージョン」を保持する「バージョン」テーブルを作成し、それをメイン テーブルにリンクします。
create table docs {
id integer primary key not null,
version integer not null,
create_date date,
change_date date,
create_user_id integer not null references users(id),
change_user_id integer references users(id),
text_data text
}
create table versions {
id integer primary key not null,
doc_id integer not null references docs(id),
version integer,
change_date date,
change_user integer not null references users(id),
text_data text
}
元のドキュメントを更新するたびに、古いテキスト値をこのテーブルにコピーし、ユーザーをコピーして日付を変更し、バージョンを上げます。
select version, change_date, change_user, text_data
into l_version, l_change_data, l_change_user, l_text_data
from docs where id = l_doc_id;
insert into versions values (newid, l_doc_id, l_version,
l_change_date, l_change_user, l_text_data);
update docs set version = version + 1, change_date = now,
change_user = cur_user, text_data = l_new_text where id = l_doc_id;
DB がそれらをサポートしている場合は、トリガーでこれを行うこともできます。
この方法の欠点は、データの完全なコピーであることです (そのため、ドキュメントが大きい場合、バージョンは大きいままです)。これは、diff(1) や patch(1) などを使用して軽減できます。
例えば:
diff version2.txt version1.txt > difffile
次に、その difffile を「バージョン 1」として保存できます。
バージョン 2 からバージョン 1 を復元するには、バージョン 2 のデータを取得し、差分ファイルのデータを使用してパッチを実行すると、v1 が得られます。
v3 から v1 に移行する場合は、これを 2 回行う必要があります (v2 を取得するために 1 回、v1 を取得するために 1 回)。
これにより、ストレージの負担が軽減されますが、(明らかに) 処理が増えるため、これをどのように行うかを判断する必要があります。