跟踪表格特定列上的版本的最佳方法是什么?

时间:2014-01-20 20:24:48

标签: ruby-on-rails postgresql

我有一个webapp,出于这些目的可以被视为一个协作博客或维基。人们查看一组文档并编辑然后重新发布它们,我们需要跟踪特定文档的已发布版本的修订历史记录。规模将是数万个文档,每个文档有10个修订版(数量级+或 - 1)和数百个数量级的用户,其中有数十个对修订历史感兴趣。

文档本身很简单(只是一个带有一些所有权/ ACL和标记属性的文本列),我正在考虑几种处理修订系统的方法。方法A将在doc表上另一列跟踪版本号。所以文档id 1可以有版本1,2,3等。在这种情况下,表需要一个索引(id,version)而不是id。

问题:这是个坏主意吗?甚至不确定在postgres的activerecord中是否可以使用没有单列主键的doc。我也可以在(doc_id,version_id)上有一个doc_id列和索引。这是足够引人注目的,因为这样调用我的REST端点为/ doc /:id将返回头部,而/ doc /:id?ver = N将返回版本N.很好地映射到我想要做的事情。

我正在考虑的另一个选项是一个单独的历史表,因此文档表包含最后一个版本,我将其他所有内容放入另一个历史表中。起初看起来并不是那么有用,但是历史表方法提供了诸如责备(谁做出这个改变)和其他数据来保存关于历史的事情。我看过paper_trail gem,它做了很多这个,但是paper_trail是为更通用的用例编写的,我只需要跟踪一个文本列的更改。

那么,建议?我的数据库组织技能正在慢慢加速,我觉得这是一个我可以犯错误的地方。

2 个答案:

答案 0 :(得分:1)

您是否考虑使用 paper trail https://github.com/airblade/paper_trail)之类的东西,我之前使用过类似的任务集,我喜欢它用于版本控制。

答案 1 :(得分:0)

(id, version)方法的问题在于,获取最新版本的方法很笨拙且效率低下,而这正是大多数时候你想做的事情。

我强烈建议将旧版本存储在边桌中。不要尝试按顺序编号版本,例如1,2,3,4;通过 date 存储它们。如果您在显示时需要版本号系列,请使用row_number()窗口功能,例如:

SELECT row_number() OVER (ORDER BY version_created_time),
       version_text
FROM versions;

此外,您正在使用ActiveRecord,这是一个糟糕的自以为是的OR​​M,拒绝正确支持各种有用的基本关系数据库功能,如自然复合键。试图让它这样做可能是一个痛苦的世界。