Я узнал, что RCS для моделей является интересной проблемой для решения в контексте персистентности данных. Они - несколько решений с помощью django ORM для достижения этого django-возвращения и AuditTrail, каждый из которых предлагают их собственный способ сделать это.
Вот модель (в django-model-like формате), который я хотел бы иметь изменения:
class Page(Model):
title = CharField()
content = TextField()
tags = ManyToMany(Tag)
authors = ManyToMany(Author)
Как Вы сделали бы это в Вас предпочтенный дб (монго, neo4j, CouchDb, Хранилище данных GAE)?
Отправьте только один пример моделей RCS по почте.
Я не прошу полный код (возможно, объяснение достаточно?), но достаточно видеть, как этой проблемой можно заняться в каждом типе дб.
В CouchDB это довольно просто. У каждого элемента в БД есть _id и _rev. Таким образом, вам не нужен отдельный номер ревизии. Я бы тогда, наверное, так и поступил. Присвойте каждому элементу системный номер. Этот номер будет ссылкой на другую запись БД, содержащую дату, комментарий и пользователя для этой ревизии.
Примеры:
отслеживаемый элемент:
{
_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"]
}
Мне это кажется довольно элегантным ....
Во-первых, если вы используете CouchDB, не используйте поле _rev.
Почему? Старые ревизии теряются при сжатии базы данных.
Сжатие перезаписывает файл базы данных, удаление устаревших редакций документов и удаленные документы.
Вики CouchDB - Страница сжатия
Есть пара возможных решений:
Какая из них лучше? Это зависит от того, как будут доступны ваши данные. Если вы можете опрашивать старые ревизии независимо от текущих ревизий, то хранение документа в 2 разных базах данных даст вам некоторое преимущество в производительности.