7

我发现模型的 RCS 是一个在数据持久性方面需要解决的有趣问题。他们是几个使用 django ORM 来实现这个django-reversionAuditTrail的解决方案,每个解决方案都提出了自己的方法来做到这一点。

这是我想要修改的模型(类似 django-model 的格式):

class Page(Model):

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

你会如何在你喜欢的数据库(Mongo、neo4j、CouchDb、GAE Datastore)中做到这一点?

请在每篇文章中仅发布一个 RCS 模型示例。

我不是要完整的代码(也许解释就足够了?)但足以了解如何在每种数据库类型中解决此问题。

4

2 回答 2

2

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

为什么?压缩数据库时,旧修订会丢失。

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

CouchDB wiki - 压缩页面

有几个可能的解决方案:

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

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

于 2010-01-18T21:26:40.540 回答
0

在 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"]
}

对我来说,它似乎很优雅......

于 2010-01-08T16:05:03.330 回答