实现维基百科的历史功能

时间:2009-06-12 07:10:01

标签: wikipedia

我正在编写一个Web应用程序,它具有用于编辑文档的用户界面。实现维基百科等历史记录功能的最佳方法是什么?可以查看对文档的编辑?

4 个答案:

答案 0 :(得分:3)

您必须存储当前文档和存档更改以进行比较。通常,主文档是数据库中的文档,然后保存的旧版本保存到另一个存档数据库或服务。

然后,您可以提取最新和最新的存档版本,并将其与差异算法进行比较。

Python有一个diff算法工具difflib:http://docs.python.org/library/difflib.html 还有一个目录和文件比较工具:http://docs.python.org/library/filecmp.html#module-filecmp

许多其他语言也有差异算法实现。

你可以只在变化中存储增量,并像Subversion一样重建Berkley数据库,但我建议为了简单起见,只需保存内容的副本,然后比较最新的或用户选择的每个。

答案 1 :(得分:1)

使用版本控制系统作为基础(将每个版本保存到vcs中),它们将更改存储在增量中。然后,您可以使用它们的diff功能来获取差异,但是您必须解析输出。例如,在git中,只需将哈希作为参数提供给git-diff,就可以从两个不同的修订版中获得输出。

也就是说,如果您不愿意使用现有系统。

答案 2 :(得分:0)

如果不知道你使用什么框架和什么,这是一个很难回答的难题。

您是否在使用数据库存储?假设您的数据库中有一个pages表,为什么不创建一个用于保存旧版本的pages_versions表?

将任何内容保存到pages表时,请先将副本插入pages_versions。因此,检索旧版本并不比通过任何其他一对多关系加载数据困难。您可以使用colourised diff或whatnot来美化数据。

我相信一些框架现在支持使用版本控制系统作为存储后端,因此也值得研究。

答案 3 :(得分:0)

您是指后端设置,还是前端突出显示各个更改?

我无法帮助你使用前端位,但是......

如果它是后端,你需要的是:

  1. 包含say,id和title列的'documents'表。
  2. 包含document_id(FK),body_text,edit_date,author,version
  3. 列的'versions'表
  4. 在您的应用程序中,首先在文档表中创建新的文档引用,然后将数据作为新版本存储在版本表中。当用户更新旧文档时,将在document_id中使用相同的文档引用创建新版本。
  5. (我想我可能没有很好地解释这一点,很抱歉!)

    顺便说一句,如果您使用的是Rails,那么有几个插件可以为您完成大部分工作。 Acts_As_Versioned是我想到的第一个。