存储消息的修订版本
在存储修订更改(例如stackoverflow和Wikipedia)中涉及哪些算法和过程?
仅保留邮件的一个副本吗?如果是的话,那只是最新的副本吗?那么,只有更改才能返回到以前的版本吗? (这样可以更快地显示主要消息)。
还是存储完整的消息?如果是,是否在每个显示器上进行比较?
哪种算法最适合用来确定邮件中的确切更改?此数据如何存储在数据库中?
如果有人确切知道我想知道什么维基百科或者stackoverlfow。
解决方案
回答
通常,消息存储为完整的快照。以前的版本被禁用,并显示最新版本。可能会使用诸如缓存哪个版本为最新版本之类的优化。
回答
最长的通用子字符串算法可用于检测版本之间的差异,但它受到限制。例如,它不会检测到文本的移动,但是会将其视为无关的删除和插入。
我认为网站通常会完整地存储最新副本,并从那里应用反向差异。这也是CVS的工作方式,但是Subversion使用前向差异,这会导致较慢的签出。
要将其存储在数据库中,可以维护一个具有最新版本的主表,并拥有一个具有相反差异的单独表。该表中的行格式为((article_id,revision_id,difference))。
回答
典型的修订版本更改是使用增量算法存储的,因此唯一存储的数据是每个修订版本相对于原始版本所做的更改。我不确定维基百科或者stackoverflow他们是如何实现的。
回答
我将使用以下技术:
- 将当前消息存储为全文。
- 使用增量算法存储历史记录。
定期显示可保持良好的性能,同时将历史记录的存储空间降至最低。
回答
Mediawiki(用于Wikipedia的软件)存储所有修订的全文,请参见数据库架构。 Mediawiki文本表中的每个条目都有标志,用于指示内容是否为gziped,使用标准压缩通常是最明智的选择。
我无法告诉我们如何从算法上进行差异比较,但是无论我们使用哪种算法,都应该从文本的两个完整版本中完成。那就是从数据库中获取旧对象和新对象的完整版本,然后进行比较。这使得可以容易地改变差异算法。
Git是Unix应用程序的一个很好的例子,它可以进行非常便宜的(存储和快速)增量存储。有可以使用git的Wiki,例如ikiwiki,但我猜我们想使用数据库来完成此操作。
回答
公认的答案是非常糟糕的。问题:
- 慢
- 非未来的证明
- 复杂