2009-03-04 62 views
6

任何人都知道创建类似wiki的数据存储的API(php更可取,但我会对任何语言感兴趣)?Rolling Your own Plaintext Wiki(Wiki in a DB)

如何在滚动您自己的明文维基上的任何资源?其他明文维基如何处理文本文件的格式?

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

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

到目前为止,我将MediaWiki分解并将其嵌入数据库的方法看起来有点过分。我认为推出我自己的纯文本wiki会更容易,并将此文件存储在数据库的适当文本字段中。

+0

你无法新表添加到数据库什么的?我并不追求为什么你想在数据库中创建一个“纯文本”wiki。也许我只是不了解你的术语。 – 2009-03-04 23:59:40

+0

我想要在我的数据库中存储单个文本字段中的单个wiki页面的等效内容 – ack 2009-03-05 00:08:31

回答

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 

然后你就可以说difffile存储为 “版本1”。

为了从2版本恢复版本1,你抢第2个的数据,使用diff文件数据在其上运行的补丁,这给了你V1。

如果你想从V3去V1,你需要做的这两次(一次获得V2,然后再拿到V1)。

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

0

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

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

0

这听起来像你基本上只是在寻找版本控制。如果是这样的话,你可能想看看差异算法。

这是维基百科Diff的页面。

我做了一个快速的PHP差异谷歌搜索,但没有真正站出来作为一个体面的例子,因为我只有基本的PHP知识。

2

威尔的巨大答案是正确的,但可以总结,我想:你需要存储的版本,然后你需要存储元数据(谁的数据是什么的时候)。

但是你的问题是关于维基版本的资源。我没有(嗯,一个:Will's answer above)。然而,关于维基的存储,我有一个。检查出the comparison matrix from DokuWiki。我知道。你在想“我在乎什么品牌的数据库不同的Wiki使用?”因为DokuWiki使用纯文本文件。你可以打开它们,它们确实很简单。所以这是一种方法,并且他们有一些有趣的理由说明为什么DBMS不是最好的方法。他们甚至没有太多的元数据:大部分的东西都是通过平面文件本身完成的。

DokuWiki的的点,你的是,也许这是一个比较简单的问题(这取决于你想如何解决呢:)