Как Вы реализовали бы систему управления версиями для своих моделей в Вашей предпочтенной парадигме дб?

Я узнал, что 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 по почте.

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

7
задан 6 revs, 2 users 100% 28 September 2011 в 16:24
поделиться

2 ответа

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

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

0
ответ дан 7 December 2019 в 18:43
поделиться

Во-первых, если вы используете CouchDB, не используйте поле _rev.

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

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

Вики CouchDB - Страница сжатия

Есть пара возможных решений:

  1. Сохранить актуальные и старые ревизии в одной базе данных. Добавить дополнительное поле ревизии для определения разницы между текущей и старой ревизиями.
  2. Хранить старые ревизии в отдельной базе данных. При добавлении новой ревизии в "текущую" базу данных можно удалить старую ревизию и вставить её в базу данных "ревизий".

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

2
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: