我有一个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是为更通用的用例编写的,我只需要跟踪一个文本列的更改。
那么,建议?我的数据库组织技能正在慢慢加速,我觉得这是一个我可以犯错误的地方。
答案 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,这是一个糟糕的自以为是的ORM,拒绝正确支持各种有用的基本关系数据库功能,如自然复合键。试图让它这样做可能是一个痛苦的世界。