所以,基本上这是“我如何版本文本信息在我的数据库”。
那么,最简单的方法就是简单地复制数据。
只需创建一个包含数据“旧版本”的“版本”表,并将其链接回主表。
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”。
为了从2版本恢复版本1,你抢第2个的数据,使用diff文件数据在其上运行的补丁,这给了你V1。
如果你想从V3去V1,你需要做的这两次(一次获得V2,然后再拿到V1)。
这会降低您的存储负担,但会增加您的处理(显然),因此您必须判断要如何执行此操作。
你无法新表添加到数据库什么的?我并不追求为什么你想在数据库中创建一个“纯文本”wiki。也许我只是不了解你的术语。 – 2009-03-04 23:59:40
我想要在我的数据库中存储单个文本字段中的单个wiki页面的等效内容 – ack 2009-03-05 00:08:31