Итак, в основном это «как я могу записывать текстовую информацию в моей БД».
Ну, самый простой способ - просто скопировать данные.
Просто создайте таблицу «version», которая содержит «старые версии» данных, и свяжите ее с основной таблицей.
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;
Вы можете даже сделать это в триггере, если ваша БД поддерживает их.
Недостатки этого метода в том, что он является полной копией данных (поэтому, если у вас большой документ, версия остается большой). Вы можете уменьшить это, используя что-то вроде diff (1) и patch (1).
Например:
diff version2.txt version1.txt > difffile
Тогда вы можете сохранить этот difffile как «версия 1».
Чтобы восстановить версию 1 из версии 2, вы берете данные версии 2, запускаете патч для них, используя данные файла diff, и это дает вам v1.
Если вы хотите перейти с v3 на v1, вам нужно сделать это дважды (один раз, чтобы получить v2, а затем снова, чтобы получить v1).
Это снижает нагрузку на хранилище, но увеличивает обработку (очевидно), поэтому вам придется судить, как вы хотите это сделать.