Как бы вы внедрили систему контроля версий для ваших моделей в вашей предпочтительной парадигме БД? - PullRequest
7 голосов
/ 08 января 2010

Я обнаружил, что RCS для моделей - это интересная проблема, которую необходимо решить в контексте сохранения данных. Это несколько решений, использующих django ORM для достижения django-reversion и AuditTrail , каждый из которых предлагает свой собственный способ сделать это.

Вот модель (в формате, похожем на django-модель), которую я хотел бы получить в редакции:

class Page(Model):

    title = CharField()
    content = TextField()
    tags = ManyToMany(Tag)
    authors = ManyToMany(Author)
  • Каждая ревизия должна быть аннотирована датой , номером ревизии , комментарием и пользователем , который внес изменения.

Как бы вы сделали это в предпочитаемом вами дБ (Mongo, neo4j, CouchDb, GAE Datastore)?

Пожалуйста, опубликуйте только один пример моделей RCS на пост.

Я не прошу полный код (может быть, достаточно объяснения?), Но достаточно, чтобы понять, как можно решить эту проблему в каждом типе БД.

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Прежде всего, если вы используете CouchDB, не используйте поле _rev.

Почему? Старые версии теряются при сжатии базы данных.

Сжатие переписывает файл базы данных, удаление устаревших версий документа и удаленные документы.

CouchDB wiki - страница уплотнения

Существует несколько возможных решений:

  1. Сохранить текущие и старые версии в одной базе данных . Добавьте дополнительное поле ревизии, чтобы определить разницу между текущей и старой ревизиями.
  2. Хранить старые ревизии в отдельной базе данных . Когда новая редакция добавляется в «текущую» базу данных, старый документ редакции можно удалить и вставить в базу данных «редакции».

Какой из них лучше? Это зависит от того, как ваши данные будут доступны. Если вы можете запрашивать старые ревизии независимо от текущих ревизий, то сохранение документа в 2 разных базах данных даст вам некоторые преимущества в производительности.

0 голосов
/ 08 января 2010

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

Мне это кажется довольно элегантным ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...