基本上这是一个“如何在我的数据库中对文本信息进行版本控制”的问题。
那么,最简单的方法就是简单地复制数据。
简单地创建一个“版本”表来保存数据的“旧版本”,并将其链接回主表即可。
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
然后您可以将该差异文件存储为“版本1”。
要从版本2恢复版本1,需要获取版本2数据,使用差分文件数据运行补丁程序,这会给您提供v1。
如果想从v3到v1,则需要执行此操作两次(一次获取v2,然后再次获取v1)。
这降低了您的存储负担,但增加了处理量(显然),因此您必须判断如何处理。