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