如何在您的首选db范例中为您的模型实施修订控制系统?

问题描述:

我发现RCS for models是一个在数据持久性环境中解决的有趣问题。他们是使用django ORM来实现这个django-reversionAuditTrail的几个解决方案,每个解决方案都提出了自己的方法来完成它。如何在您的首选db范例中为您的模型实施修订控制系统?

这里是我想有修正模型(在Django模型类格式):

class Page(Model): 

    title = CharField() 
    content = TextField() 
    tags = ManyToMany(Tag) 
    authors = ManyToMany(Author) 
  • 每个版本应该以日期被注释,一个版本号评论用户做了修改。

你会如何在你首选db(Mongo,neo4j,CouchDb,GAE Datastore)?

请仅发布每个帖子的RCS模型的一个示例。

我不是要求一个完整的代码(也许一个解释就够了?),但足以看到如何解决这个问题在每个数据库类型。

+0

你能更具体吗? – 2010-01-07 21:39:33

在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

有几个可能的解决方案:

  1. 保持当前和老版本在同一个数据库。添加额外的修订字段以确定当前版本和旧版本之间的差异。
  2. 将旧版本存储在单独的数据库中。当新版本添加到“当前”数据库时,旧版本文档可以被删除并插入到“版本”数据库中。

哪一个最好?这取决于你的数据将如何被访问。如果您可以独立于当前版本查询旧版本,那么将该文档存储在两个不同的数据库中将为您带来一些性能优势。