2012-02-09 80 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。

相关问题