6

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

滚动您自己的纯文本 wiki 的任何资源如何?其他纯文本 wiki 如何处理文本文件的格式?

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

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

到目前为止,我将 MediaWiki 拆分并整合到数据库中的方法似乎有点矫枉过正。我认为滚动我自己的纯文本 wiki 并将此文件存储在数据库的适当文本字段中会容易得多。

4

4 回答 4

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.1 版本。

如果您想从 v3 转到 v1,则需要执行两次(一次获取 v2,然后再次获取 v1)。

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

于 2009-03-05T00:41:35.963 回答
2

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

但是您的问题是关于类似 Wiki 的版本控制的资源。我没有(嗯,一个:上面威尔的回答)。但是,关于 Wiki 的存储,我有一个。查看来自 DokuWiki 的比较矩阵。我知道。你在想“我在乎什么品牌的 DB 不同的 Wiki 使用?” 因为 DokuWiki 使用纯文本文件。你可以打开它们,它们确实很简单。所以这是一种方法,对于为什么 DBMS 不是最好的方法,他们有一些有趣的论据。它们甚至不包含太多元数据:大部分内容都是通过平面文件本身完成的。

DokuWiki 对您的意义在于,这可能是一个相对简单的问题(取决于您想要解决的程度:)

于 2009-03-05T01:04:49.903 回答
0

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

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

于 2009-03-05T00:12:05.723 回答
0

听起来您实际上只是在寻找版本控制。如果是这种情况,您可能需要研究 diff 算法。

这是维基百科差异页面。

我做了一个快速的 php diff google 搜索,但没有一个像样的例子,因为我只有基本的 PHP 知识。

于 2009-03-05T00:38:36.360 回答