什么是在数据库中存储差异最紧凑的方法?

时间:2012-02-09 19:15:04

标签: php mysql version-control

我想实现类似维基媒体修订历史的内容?什么是最好的PHP函数/库/扩展/算法?

我希望差异尽可能紧凑,但我很高兴只能显示每个修订版本与其兄弟版本之间的差异,并且只能一次回滚一个修订版本。

在某些情况下,只有少数几个字符可能会发生变化,而在其他情况下,整个字符串可能会发生变化,所以我很想知道某些技术对于小变化是否比对大变量更好,如果在某些情况下它更多有效地存储整个副本。

使用Git或SVN之类的东西支持整个系统似乎有点极端,我真的不想将文件存储在磁盘上。

3 个答案:

答案 0 :(得分:12)

整个存储记录要比存储它们的差异要容易得多。然后,如果您想要两个版本的差异,可以使用the PECL Text_Diff library生成一个。

我喜欢将记录的所有版本存储在一个表中,并使用MAX(revision),“当前”布尔属性或类似方法检索最新版本的记录。其他人更喜欢非规范化并拥有一个镜像表,其中包含非当前版本。

如果存储差异,则架构和算法会变得更加复杂。然后,您需要存储至少一个“完整”版本和多个“diff”版本,并在需要完整版本时从一组差异中重建完整版本。 (这就是SVN存储内容的方式.Git存储每个修订版的完整副本,而不是差异。)

程序员时间很昂贵,但磁盘空间通常很便宜。请考虑是否完整存储每个版本是一个问题。

答案 1 :(得分:2)

您必须问自己:最终用户想要更频繁地检索哪种类型的数据:修订或修订的差异? 我会使用unix的标准diff。并且,根据上述问题的答案,在数据库中存储差异或整个修订。

  

用Git或SVN之类的东西支持整个系统似乎有点极端

为什么呢? Github,AFAIR,以这种方式存储wiki;)

答案 2 :(得分:0)

我会使用diff来创建delta,patch按顺序应用一个或多个编辑来构建已知状态的文档。当然,您执行的操作越多,您就可以将此任务卸载到版本控制工具。我有两次重新设计差异/补丁系统,以便将SVN用于此类任务。

相关问题