您将如何在首选的数据库范例中为模型实现修订控制系统?

时间:2010-01-07 21:03:19

标签: sql persistence key-value-store graph-databases document-database

我发现模型的RCS是一个有趣的问题,需要在数据持久化的环境中解决。它们是使用django ORM实现此django-reversionAuditTrail的几个解决方案,每个都提出了自己的方法。

以下是我希望修改的模型(采用django-model-like格式):

class Page(Model):

    title = CharField()
    content = TextField()
    tags = ManyToMany(Tag)
    authors = ManyToMany(Author)
  • 每个修订都应使用日期修订号评论用户进行注释做了修改。

你会如何在你喜欢的db(Mongo,neo4j,CouchDb,GAE Datastore)中做到这一点?

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

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

2 个答案:

答案 0 :(得分:2)

首先,如果您使用的是CouchDB,请不要使用_rev字段。

为什么呢?压缩数据库时会丢失旧版本。

  

压缩重写数据库文件,   删除过时的文档修订   和删除的文件。

CouchDB wiki - Compaction page

有几种可能的解决方案:

  1. 将当前和旧版本保留在同一个数据库中。添加额外的修订字段以确定当前版本和旧版本之间的差异。
  2. 将旧版本存储在单独的数据库中。将新修订添加到“当前”数据库时,可以删除旧修订文档并将其插入“修订版”数据库。
  3. 哪一个最好?这取决于您的数据将如何被访问。如果您可以独立于当前版本查询旧版本,那么将文档存储在2个不同的数据库中将为您带来一些性能优势。

答案 1 :(得分:0)

在CouchDB中,这是相当简单的。 DB中的每个项目都有一个_id和一个_rev。因此,您不需要单独的修订号。我当时可能会这样做。为每个项目分配systemrev编号。此编号将是指向包含该修订的日期,注释和用户的另一个DB记录的链接。

示例:

正在跟踪的项目:

{
     _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"]
}

对我来说,这看起来很优雅......