您将如何在您喜欢的数据库范式中为您的模型实施修订控制系统?
Posted
技术标签:
【中文标题】您将如何在您喜欢的数据库范式中为您的模型实施修订控制系统?【英文标题】: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-reversion 和 AuditTrail 每个都提出了自己的方法来做到这一点。
这是我想要修改的模型(类似于 django-model 的格式):
class Page(Model):
title = CharField()
content = TextField()
tags = ManyToMany(Tag)
authors = ManyToMany(Author)
每个修订版都应使用日期、修订号、评论和用户进行注释做了修改。
你会如何在你喜欢的数据库(Mongo、neo4j、CouchDb、GAE Datastore)中做到这一点?
请在每篇文章中仅发布一个 RCS 模型示例。
我不是要求完整的代码(也许解释就足够了?)但足以了解如何在每种数据库类型中解决此问题。
【问题讨论】:
【参考方案1】:首先,如果您使用的是 CouchDB,请不要使用 _rev 字段。
为什么?压缩数据库时,旧修订会丢失。
压缩重写数据库文件, 删除过时的文档修订 并删除了文件。
CouchDB wiki - Compaction page
有几种可能的解决方案:
-
将当前和旧版本保存在同一个数据库中。添加额外的修订字段以确定当前修订与旧修订之间的差异。
将旧版本存储在单独的数据库中。将新修订添加到“当前”数据库时,可以删除旧修订文档并将其插入“修订”数据库。
哪个最好?这取决于您的数据将如何被访问。如果您可以独立于当前版本查询旧版本,那么将文档存储在 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"]
对我来说,它看起来很优雅......
【讨论】:
以上是关于您将如何在您喜欢的数据库范式中为您的模型实施修订控制系统?的主要内容,如果未能解决你的问题,请参考以下文章