我发现模型的RCS是一个有趣的问题,需要在数据持久化的环境中解决。它们是使用django ORM实现此django-reversion和AuditTrail的几个解决方案,每个都提出了自己的方法。
以下是我希望修改的模型(采用django-model-like格式):
class Page(Model):
title = CharField()
content = TextField()
tags = ManyToMany(Tag)
authors = ManyToMany(Author)
你会如何在你喜欢的db(Mongo,neo4j,CouchDb,GAE Datastore)中做到这一点?
请在每个帖子中仅发布一个RCS模型示例。
我不是要求一个完整的代码(也许解释就足够了?)但足以看到每个数据库类型如何解决这个问题。
答案 0 :(得分:2)
首先,如果您使用的是CouchDB,请不要使用_rev字段。
为什么呢?压缩数据库时会丢失旧版本。
压缩重写数据库文件, 删除过时的文档修订 和删除的文件。
CouchDB wiki - Compaction page
有几种可能的解决方案:
哪一个最好?这取决于您的数据将如何被访问。如果您可以独立于当前版本查询旧版本,那么将文档存储在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"]
}
对我来说,这看起来很优雅......