所以,基本上这是“如何在数据库中版本化文本信息”。
嗯,最简单的方法就是复制数据。
简而言之,创建一个保存数据“旧版本”的“版本”表,并将其链接回主表。
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
然后您可以将该 diff 文件存储为“版本 1”。
为了从版本 2 恢复版本 1,您需要获取版本 2 数据,使用 diff 文件数据对其运行补丁,这样您就可以得到 v1.1 版本。
如果要从 v3 转到 v1,则需要执行两次(一次获取 v2,然后再次获取 v1)。
这会减轻您的存储负担,但会增加您的处理能力(显然),因此您必须判断要如何执行此操作。