如何在您的首选db范例中为您的模型实施修订控制系统?
问题描述:
我发现RCS for models是一个在数据持久性环境中解决的有趣问题。他们是使用django ORM来实现这个django-reversion和AuditTrail的几个解决方案,每个解决方案都提出了自己的方法来完成它。如何在您的首选db范例中为您的模型实施修订控制系统?
这里是我想有修正模型(在Django模型类格式):
class Page(Model):
title = CharField()
content = TextField()
tags = ManyToMany(Tag)
authors = ManyToMany(Author)
- 每个版本应该以日期被注释,一个版本号 ,评论和用户做了修改。
你会如何在你首选db(Mongo,neo4j,CouchDb,GAE Datastore)?
请仅发布每个帖子的RCS模型的一个示例。
我不是要求一个完整的代码(也许一个解释就够了?),但足以看到如何解决这个问题在每个数据库类型。
答
在CouchDB中,这非常简单。数据库中的每个项目都有一个_id和一个_rev。所以你不需要一个单独的版本号。那么我可能会这样做。为每个项目分配一个systemrev编号。这个数字将是另一个数据库记录的链接,其中包含该修订的日期,评论和用户。
例子:
项目正在跟踪:
{
_id: "1231223klkj123",
_rev: "4-1231223klkj123",
systemRev: "192hjk8fhkj123",
foo: "bar",
fooarray: ["bar1", "bar2", bar3"]
}
,然后创建一个单独的版本记录:
{
_id: "192hjk8fhkj123",
_rev: "2-192hjk8fhkj123",
user: "John",
comment: "What I did yesterday",
date: "1/1/2010",
tags: ["C# edits", "bug fixes"]
}
对我来说似乎很优雅....
答
首先,如果您使用的是CouchDB,请不要使用_rev字段。
为什么?压缩数据库时旧版本会丢失。
压实重写数据库文件, 删除过时的文件修订 和删除文件。
CouchDB wiki - Compaction page
有几个可能的解决方案:
- 保持当前和老版本在同一个数据库。添加额外的修订字段以确定当前版本和旧版本之间的差异。
- 将旧版本存储在单独的数据库中。当新版本添加到“当前”数据库时,旧版本文档可以被删除并插入到“版本”数据库中。
哪一个最好?这取决于你的数据将如何被访问。如果您可以独立于当前版本查询旧版本,那么将该文档存储在两个不同的数据库中将为您带来一些性能优势。
你能更具体吗? – 2010-01-07 21:39:33