Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Подход к версионированию данных в реляционной БД - PyCon RU 2013

Подход к версионированию данных в реляционной БД - PyCon RU 2013

Konstantin Lopuhin

February 24, 2013
Tweet

More Decks by Konstantin Lopuhin

Other Decks in Programming

Transcript

  1. Время и состояние Существующие решения Documents . . Подход к

    версионированию данных в реляционной БД
  2. . . Время и состояние Существующие решения Documents Но мы

    привыкли... france.president = u'Francois Hollande' for (var i = 0; i < 10; i++) { console.log(' i = ', i); } . . . 6
  3. . . Время и состояние Существующие решения Documents Делаем то

    же в базе данных france.president = u'Francois Hollande' france.save() или france.update( president=u'Francois Hollande') . . . 7
  4. . . Время и состояние Существующие решения Documents Мы теряем

    информацию Кто еще не использует систему контроля версий? . . . 8
  5. . . Время и состояние Существующие решения Documents Мы теряем

    информацию Кто может сказать, что было вчера после обеда? Кто может сказать, что произошло за последние 5 минут? Кто видел простое кэширование запросов к БД? . . . 9
  6. . . Время и состояние Существующие решения Documents Невозможно принять

    решение Невозможно принять решение при постоянном изменении данных. Мы хотим получить согласованное состояние: сравнивая данные из нескольких источников несколько раз смотря на данные из одного источника . . . 10
  7. . . Время и состояние Существующие решения Documents Transaction Isolation

    (1) start transaction read a bunch of data ... long computation ... read more data ... more computation end transaction Deadlocks вся логика наизнанку производительность . . . 11
  8. . . Время и состояние Существующие решения Documents Transaction Isolation

    (2) Не спасает и тут: $.get('/x/some-data/', function (data) { ... }); $.get('/x/other-stuff/', function (other_stuff) { ... }); . . . 12
  9. . . Время и состояние Существующие решения Documents Django tutorial,

    part 1 from django.db import models class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') . . . 14
  10. . . Время и состояние Существующие решения Documents Django apps

    https://www.djangopackages.com/grids/g/model-audit/: django-reversion: сериализация в JSON, magic django-versioning: JSON, сохраняет diff django-fullhistory: сериализация в JSON django-audit-log: отдельная таблица с похожей структурой . . . 15
  11. . . Время и состояние Существующие решения Documents Недостатки нужна

    отдельная поддержка массовых операций видим лишь отдельные версии документов (и то с трудом) не можем искать по истории - история это текст поддержка массовых операций (update, delete) . . . 16
  12. . . Время и состояние Существующие решения Documents Documents Вячеслав

    Федоров, июль 2010 года API стабильно с осени 2010 года используется во всех наших проектах https://github.com/chtd/doc-versions/ . . . 18
  13. . . Время и состояние Существующие решения Documents Возвращаясь к

    президентам class Country(Document): name = models.CharField(max_length=200) president = models.CharField(max_length=200) . . . 19
  14. . . Время и состояние Существующие решения Documents Наследуем от

    class Document(models.Model): document_start = models.DateTimeField( 'Time of the start of this version') document_end = models.DateTimeField( 'Time of the end of this version') document_id = models.IntegerField( 'Document identifier') class Meta: abstract = True . . . 20
  15. . . Время и состояние Существующие решения Documents Менеджер now

    Мы легко можем получить версии в любой момент времени: model.now.filter(...) # транслируется в dt = retrospection.now() model.objects.filter(document_start__lte=dt, document_end__gt=dt) .filter(...) . . . 22
  16. . . Время и состояние Существующие решения Documents Согласованное состояние

    одно время на все выполнение view используем менеджер now или замену datetime.now() - retrospection.now() - thread-local время . . . 23
  17. . . Время и состояние Существующие решения Documents Версии одного

    документа >>> Country.now.all() [] >>> fr = Country(name='France', president='Napoleon III') >>> fr.document_save() >>> Country.now.count() 0 . . . 24
  18. . . Время и состояние Существующие решения Documents Продвижение по

    времени >>> set_now() >>> Country.now.count() 1 >>> Country.now.get(document_id=1) <Country: "France under Napoleon III"> . . . 25
  19. . . Время и состояние Существующие решения Documents Редактирование >>>

    fr.president = 'Nicolas Sarkozy' >>> fr.document_save() >>> set_now() >>> Country.objects.count() 2 >>> Country.now.count() 1 . . . 26
  20. . . Время и состояние Существующие решения Documents И удаление

    >>> fr.document_delete() # not for real >>> set_now() >>> Country.objects.count() 2 >>> Country.now.count() 0 >>> fr.document_restore() # uff >>> Country.now.count() 1 . . . 27
  21. . . Время и состояние Существующие решения Documents Ретроспекция По

    умолчанию не нужно делать ничего, а если хочется странного: with current_time(datetime(1848, 12, 20)): return president_detail(fr) . . . 28
  22. . . Время и состояние Существующие решения Documents Кэширование Основная

    проблема - инвалидация данных. Два варианта: по событию изменения данных зная историю изменений => зная что изменилось . . . 29
  23. . . Время и состояние Существующие решения Documents Кэширование Тривиально

    отследить изменения: created = model.objects.filter( document_start__gte=last_sync) deleted = model.objects.filter( document_end__gte=last_sync, document_end__lt=FUTURE) last_sync = datetime.now() . . . 30
  24. . . Время и состояние Существующие решения Documents Связанные документы

    Один документ хранится в нескольких моделях. Документы ссылаются друг на друга. Виды ссылок между документами: на версию, действующую в момент создания: при помощи id на версию, действующую в текущий момент времени: при помощи document_id . . . 31
  25. . . Время и состояние Существующие решения Documents На некоторых

    моделях Например, auth.models.User не версионируется, а Profile версионируется. Не версионируются редко меняющиеся данные. Плюсы: лучше совместимость со стандартными библиотеками, более привычная схема данных Минусы: половинчатое решение, все время нужно думать о версионировании и переключаться . . . 32
  26. . . Время и состояние Существующие решения Documents На всех

    моделях Отказ от стандартного пользователя и админки... Минусы: начальный порог, реализация своего пользователя (это не так сложно), немного меньше поддержки ORM Плюсы: полное версионирование, о нем не надо думать! . . . 33
  27. . . Время и состояние Существующие решения Documents Use case:

    EAV-модель храним граф в реляционной БД (храним ребра) минимальная схема (по одной модели на каждый тип данных) тривиальное кэширование в памяти очень похожа на Datomic (Rich Hickey, создатель Clojure) . . . 34
  28. . . Время и состояние Существующие решения Documents Прореживание истории

    храним фиксированный период экспоненциальное прореживание редко бывает проблемой . . . 35
  29. . . Время и состояние Существующие решения Documents За кадром

    интеграция с django-админкой проверка целостности БД работа с составными документами . . . 36
  30. . . Время и состояние Существующие решения Documents Основные принципы

    очень простое решение, нет магии не боимся отказаться от некоторых привычных вещей используем возможности БД . . . 37
  31. Время и состояние Существующие решения Documents https://github.com/chtd/doc-versions Константин Лопухин [email protected]

    Вячеслав Федоров [email protected] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .