滚动你自己的纯文本Wiki(维基在一个数据库中)

时间:2009-03-04 23:55:09

标签: php database wiki wiki-engine

任何人都知道用于创建类似wiki的数据存储的API(我更喜欢php,但我会对任何语言感兴趣)?

滚动自己的纯文本维基的任何资源怎么样?其他明文wiki如何处理文本文件的格式?

我知道我可以使用Markdown或Textile进行格式化。但我最感兴趣的是如何处理多用户编辑的纯文本存储。

我正在编写一个主要由数据库驱动的Web应用程序。我希望此数据库的至少一个文本字段采用类似wiki的格式。具体而言,此文本可由多个用户编辑,并能够回滚到任何版本。想想Last.FM的wiki / bio部分(几乎整个网站都是由数据库严格构建的,除了每个艺术家的这一部分)。

到目前为止,我将MediaWiki拆分并将其嵌入数据库的方法看起来有些过分。我认为滚动我自己的纯文本wiki会更容易,并将此文件存储在数据库的相应文本字段中。

4 个答案:

答案 0 :(得分:15)

所以,基本上这是“如何在我的数据库中对文本信息进行版本化”。

嗯,最简单的方法就是复制数据。

只需创建一个“版本”表,其中包含数据的“旧版本”,并将其链接回主表。

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。

如果你想从v3到v1,你需要做两次(一次获得v2,然后再获得v1)。

这可以降低您的存储负担,但会增加您的处理(显然),因此您必须判断您希望如何执行此操作。

答案 1 :(得分:2)

Will的答案是否正确,但可以总结一下,我认为:你需要存储版本,然后你需要存储元数据(数据的时间是谁)。

但你的问题是关于类似Wiki的版本的资源。我没有(好吧,一个:Will's answer above)。但是,关于Wiki的存储,我有一个。查看the comparison matrix from DokuWiki。我知道。你在想“我关心什么类型的DB不同的维基使用?”因为DokuWiki使用纯文本文件。你可以打开它们,它们确实很简单。所以这是一种方法,他们有一些有趣的论据,为什么DBMS不是最好的方法。他们甚至没有多少元数据:大部分内容都是通过平面文件本身完成的。

DokuWiki的重点是,这可能是一个相对简单的问题(取决于你想要解决它的程度:):

答案 2 :(得分:0)

这是WikiMatrix上所有12个wiki的列表,这些wiki是用PHP编写的,并使用文本文件进行存储。也许其中一个将有一个可以适应数据库的存储方法:

http://www.wikimatrix.org/search.php?sid=1760

答案 3 :(得分:0)

听起来你基本上只是在寻找版本控制。如果是这种情况,您可能需要查看diff算法。

以下是维基百科Diff页面。

我做了一个快速的php diff谷歌搜索,但没有什么真正脱颖而出作为一个体面的例子,因为我只有基本的PHP知识。