2008-09-17 56 views
2

存储修订更改(如stackoverflow和wikipedia)涉及哪些算法和过程?存储消息的修订更改

是否只保留一个消息副本?如果是这样,它只是最新的副本?那么只有更改回到以前的版本(s)从那里存储? (这将使主消息更快地显示)。 或者是完整的消息存储?如果是这样的话,在每个显示器上进行比较呢?

什么算法最适合用来确定消息中的确切变化?这些数据如何存储在数据库中?

如果有人确切知道我最想知道的wikipedia或stackoverfow。

回答

1

longest common substring algorithm可用于检测版本之间的差异,但它是有限的。例如,它没有检测到文字的移动,但它会将这看作是不相关的移除和插入。

我想网站通常会将最新的副本全部存储起来,并从那里应用反向差异。这也是CVS的工作方式,但Subversion使用前进差异,这会导致结账速度变慢。

要将其存储在数据库中,可以使用最新版本维护主表,并且使用具有相反差异的单独表格。该表格将具有格式为(article_id, revision_id, differences)的行。

1

通常邮件存储为完整的快照。以前的版本被禁用,并显示最近的版本。可能会优化使用像缓存哪个版本是最新的。

0

典型的版本更改是使用delta算法存储的,因此唯一存储的数据是每个版本相对于原始版本的更改。我不确定wikipedia或者stackoverflow是如何实现的。

0

我会使用以下方法:

  • 存储当前的消息作为完整文本。
  • 使用delta算法存储历史记录。

这样可以保持您的显示效果,并保持历史记录的最小值。

4

Mediawiki(维基百科的软件)存储所有修订版的全文,请参阅database schema。 Mediawiki中的text table中的每个条目具有标志,该标志指示内容是否已经例如gziped,使用标准压缩通常是最好的选择。

我不能告诉你如何在算法上做差异,但你使用什么算法应该从文本的两个完整版本中完成。这是从数据库中获取旧的和新的对象的完整版本,然后做差异。这使得可以容易地改变差异算法。

Git是Unix应用程序的一个很好的例子,它可以做非常便宜的(存储和快速)增量存储。有些wiki可以使用git例如ikiwiki,但我猜你想要用数据库来做。

+0

希望我能接受2个回答 – 2008-09-20 07:47:51

0

接受的答案很糟糕..问题:

  • 非面向未来
  • 复杂
+0

即使你存储的每个消息的完整副本,这表明你如何做差异一旦显示“差异页面”。 – 2008-09-23 13:27:47