我已经决定在LAMP堆栈中使用Horde Text_Diff引擎来计算diff并渲染它们。我的问题是:
将增量实际存储在数据库中的好方法是什么?我以前从未设计过这种数据库应用程序,并且看起来大多数引擎都需要完整序列化的整个原始文本和更改后的文本以呈现差异。
如果是这种情况,那么如何在不存储整个新文档的情况下将diff的数据存储在数据库中呢?
(注意:对于这个特殊目的,它将始终是当前版本 - >建议diff->新的当前版本,这意味着我正在尝试存储实际差异而不是反向差异。)
答案 0 :(得分:2)
我认为您应该能够使用patch
utility。它仅以更改的形式创建两个文本(或文件)之间的差异。然后可以将创建的补丁存储在数据库中。您仍然需要原始文本,然后是所有补丁,直到最新版本。
对于PHP,xdiff Extension可用于为文本和文件创建差异。
要将差异存储在数据库中,您需要保留差异,差异内容和原始文本的顺序。
我假设您已经存储了原始文本。然后,差异可以存储到包含对原始文本的引用的diffs表中,并且自动增加键以保留diff的文本内容旁边的顺序。然后,您需要以正确的顺序插入另一个差异,并且应该没问题。
要重新创建当前版本,请查询原始版本和所有排序的差异。然后在另一个之后应用一个diff来获得你想要的版本。
或者,您也可以创建另一个包含特定修订结果的表,以防止一次又一次地运行大量循环。但是这会使数据库中的数据变得多余。
答案 1 :(得分:2)
对于Wiki应用程序,请考虑存储:
StoredEdition[X] = diff(Edition[X+1], Edition[X])
,其中Edition[0]
是最早的版本。例如。在表“articles_revisions”中,每行都有一个时间戳并引用articleID。 很抱歉,此刻我没有建议使用工具从串行差异或反向差异中重新构建文本。