【问题标题】:How would you implement a revision control system for your models in your prefered db paradigm?您将如何在您喜欢的数据库范式中为您的模型实施修订控制系统?
【发布时间】:2011-01-02 16:17:28
【问题描述】:

我发现模型的 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 模型示例。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    CouchDB wiki - Compaction page

    有几种可能的解决方案:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-01
        • 1970-01-01
        • 2012-04-19
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2011-01-03
        相关资源
        最近更新 更多