2012-02-09 77 views
4

我想實現類似於維基媒體版本歷史的內容嗎?什麼是最好的PHP函數/庫/擴展/算法使用?在數據庫中存儲差異的最簡潔方法是什麼?

我希望diffs儘可能的緊湊,但我很高興被限制在只顯示每個修訂版和其兄弟之間的差異,並且只能夠一次回滾一個修訂版。

在某些情況下,只有少數字符可能會發生變化,而在其他情況下,整個字符串可能會發生變化,所以我很想知道某些技術是否適用於小變化而不是大變動,並且在某些情況下更簡單地存儲整個副本更有效。

支持像Git或SVN這樣的整個系統似乎有點極端,我並不想將文件存儲在磁盤上。

+1

Git實際上存儲了每個版本的全部內容,而不是差異。 – 2012-02-09 19:26:10

回答

10

存儲每條記錄的整體要比存儲它們的差異要容易得多。然後如果您想要兩個版本的差異,您可以根據需要使用the PECL Text_Diff library生成一個版本。

我喜歡將所有版本的記錄存儲在一張表中,並使用MAX(revision),「當前」布爾屬性或類似方法檢索最近的一個。其他人更喜歡非規範化並且擁有一個保存非當前版本的鏡像表。

如果您存儲差異,您的模式和算法會變得更加複雜。然後,您需要至少存儲一個「完整」版本和多個「差異」版本,並在需要完整版本時從一組差異中重新構建完整版本。 (這是SVN如何存儲的東西,Git存儲了每個版本的完整副本,而不是差異)。

編程器時間很昂貴,但磁盤空間通常很便宜。請考慮是否全面存儲每個修訂版確實是一個問題。

2

您必須問自己:最終用戶需要更頻繁地檢索什麼類型的數據:版本或版本差異? 我會使用unix的標準diff。並且,根據上述問題的答案,在數據庫中存儲差異或整個修訂。

備份整個系統類似的Git或SVN似乎有點極端

爲什麼? Github,AFAIR,以這種方式存儲wiki;)

+0

到您的最後一點 - 系統可能需要運行像Heroku這樣的服務(在免費層中)沒有持久磁盤存儲 – Tim 2012-02-09 20:09:40

+0

到您的第一點 - 現階段尚不完全清楚,但我認爲該功能將很大程度上用於查看已更改的內容,而不是查看完整的先前狀態 – Tim 2012-02-09 20:27:06

+0

說了這麼多 - 最常見的操作是保存修訂,這意味着每次保存差異會帶來最大的開銷。我認爲這是存儲整個版本的一個勝利。 – Tim 2012-02-09 20:52:08

0

我會使用diff來實現它,以創建增量和patch,以按順序應用一個或多個編輯來構建處於已知狀態的文檔。當然,你做得越多,就越清楚你可以把這個任務卸載到一個版本控制工具上。我有兩次重新設計的差異/補丁系統爲這種類型的任務使用SVN。

相關問題