如何在数据库中存储文本差异


How To Store Text Diffs in DB?

我已经决定在LAMP堆栈中使用Horde Text_Diff引擎来计算差异并渲染它们。我的问题是:

将增量实际存储在数据库中的好方法是什么?我以前从未设计过这种数据库应用程序,而且似乎大多数引擎都希望获得整个原始文本和更改文本的完全序列化副本,以呈现差异。

如果是这样的话,那么我如何在不存储整个新文档的情况下将diff的数据存储在数据库中?

(注意:出于这个特殊目的,它将始终是当前版本->建议的diff->新的当前版本,这意味着我试图存储实际的diff而不是反向diff。)

对于Wiki应用程序,请考虑存储:

  1. 最新版本的全文[便于搜索、快速显示],例如在表格中的"文章"
  2. 旧版本作为最新文本的反向差异。每个先前版本都可以存储为StoredEdition[X] = diff(Edition[X+1], Edition[X]),其中Edition[0]是最旧的。例如,在一个表"articles_revisions"中,每一行都有一个时间戳并引用articleID

抱歉,目前我没有建议使用工具从串行diff或反向diff重新构建文本。

我认为您应该能够使用patch实用程序。它只以更改的形式在两个文本(或文件)之间产生差异。创建的补丁可以存储在数据库中。您仍然需要原始文本,然后需要最新修订版的所有补丁。

对于PHP,xdiff扩展可用于创建文本和文件的diff。

在数据库中存储DIFF

要将diff存储在数据库中,您需要保留diff的顺序、diff内容和原始文本。

我想你已经在存储原始文本了。然后,diffs可以存储到diffs表中,该表包含对原始文本的引用和自动递增键,以保留diffs文本内容旁边的顺序。然后,您需要按照正确的顺序一个接一个地插入diff,这应该没问题。

要重新创建当前版本,请查询原始版本和所有排序的diff。然后应用一个又一个diff来获得你想要的版本。

或者,您也可以创建另一个包含特定修订结果的表,以防止重复运行大量周期。但这会使数据库中的数据变得多余。