2009-03-04 73 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的的點,你的是,也許這是一個比較簡單的問題(這取決於你想如何解決呢:)