Date post: | 12-May-2015 |
Category: |
Technology |
Upload: | it-people |
View: | 838 times |
Download: | 2 times |
..Время и состояниеСуществующие решенияDocuments
.
..Подход к
версионированиюданных в
реляционной БД
..
Время и состояниеСуществующие решенияDocuments
Время и состояние
...2
..
Время и состояниеСуществующие решенияDocuments
Президент Франции
Это он!
...3
..
Время и состояниеСуществующие решенияDocuments
Президент Франции
Или он?
...4
..
Время и состояниеСуществующие решенияDocuments
Президент Франции
Нет, он!
...5
..
Время и состояниеСуществующие решенияDocuments
Но мы привыкли...
france.president = u'Francois Hollande'
for (var i = 0; i < 10; i++) {console.log(' i = ', i);
}
...6
..
Время и состояниеСуществующие решенияDocuments
Делаем то же в базе данных
france.president = u'Francois Hollande'france.save()
илиfrance.update(
president=u'Francois Hollande')
...7
..
Время и состояниеСуществующие решенияDocuments
Мы теряем информацию
Кто еще не использует систему контроля версий?
...8
..
Время и состояниеСуществующие решенияDocuments
Мы теряем информацию
I Кто может сказать, что было вчера после обеда?I Кто может сказать, что произошло за последние 5 минут?I Кто видел простое кэширование запросов к БД?
...9
..
Время и состояниеСуществующие решенияDocuments
Невозможно принять решение
Невозможно принять решение при постоянном измененииданных.Мы хотим получить согласованное состояние:
I сравнивая данные из нескольких источниковI несколько раз смотря на данные из одного источника
...10
..
Время и состояниеСуществующие решенияDocuments
Transaction Isolation (1)
start transactionread a bunch of data...long computation...read more data...more computation
end transaction
I DeadlocksI вся логика наизнанкуI производительность
...11
..
Время и состояниеСуществующие решенияDocuments
Transaction Isolation (2)
Не спасает и тут:$.get('/x/some-data/', function (data) {
...});$.get('/x/other-stuff/', function (other_stuff) {
...});
...12
..
Время и состояниеСуществующие решенияDocuments
Существующие решения
...13
..
Время и состояниеСуществующие решения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
..
Время и состояниеСуществующие решенияDocuments
Django apps
https://www.djangopackages.com/grids/g/model-audit/:I django-reversion: сериализация в JSON, magicI django-versioning: JSON, сохраняет diffI django-fullhistory: сериализация в JSONI django-audit-log: отдельная таблица с похожей
структурой
...15
..
Время и состояниеСуществующие решенияDocuments
Недостатки
I нужна отдельная поддержка массовых операцийI видим лишь отдельные версии документов (и то с
трудом)I не можем искать по истории - история это текстI поддержка массовых операций (update, delete)
...16
..
Время и состояниеСуществующие решенияDocuments
Documents
...17
..
Время и состояниеСуществующие решенияDocuments
Documents
I Вячеслав Федоров, июль 2010 годаI API стабильно с осени 2010 годаI используется во всех наших проектахI https://github.com/chtd/doc-versions/
...18
..
Время и состояниеСуществующие решенияDocuments
Возвращаясь к президентам
class Country(Document):name = models.CharField(max_length=200)president = models.CharField(max_length=200)
...19
..
Время и состояниеСуществующие решения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
..
Время и состояниеСуществующие решенияDocuments
Интервал действия версии
...21
..
Время и состояниеСуществующие решенияDocuments
Менеджер now
Мы легко можем получить версии в любой момент времени:model.now.filter(...)# транслируется вdt = retrospection.now()model.objects.filter(document_start__lte=dt,
document_end__gt=dt).filter(...)
...22
..
Время и состояниеСуществующие решенияDocuments
Согласованное состояние
I одно время на все выполнение viewI используем менеджер now или замену datetime.now() -
retrospection.now() - thread-local время
...23
..
Время и состояниеСуществующие решенияDocuments
Версии одного документа
>>> Country.now.all()[]>>> fr = Country(name='France', president='Napoleon III')>>> fr.document_save()>>> Country.now.count()0
...24
..
Время и состояниеСуществующие решенияDocuments
Продвижение по времени
>>> set_now()>>> Country.now.count()1>>> Country.now.get(document_id=1)<Country: "France under Napoleon III">
...25
..
Время и состояниеСуществующие решенияDocuments
Редактирование
>>> fr.president = 'Nicolas Sarkozy'>>> fr.document_save()>>> set_now()>>> Country.objects.count()2>>> Country.now.count()1
...26
..
Время и состояниеСуществующие решения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
..
Время и состояниеСуществующие решенияDocuments
Ретроспекция
По умолчанию не нужно делать ничего, а если хочетсястранного:with current_time(datetime(1848, 12, 20)):
return president_detail(fr)
...28
..
Время и состояниеСуществующие решенияDocuments
Кэширование
Основная проблема - инвалидация данных. Два варианта:I по событию изменения данныхI зная историю изменений => зная что изменилось
...29
..
Время и состояниеСуществующие решения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
..
Время и состояниеСуществующие решенияDocuments
Связанные документы
Один документ хранится в нескольких моделях. Документыссылаются друг на друга. Виды ссылок между документами:
I на версию, действующую в момент создания: припомощи id
I на версию, действующую в текущий момент времени:при помощи document_id
...31
..
Время и состояниеСуществующие решенияDocuments
На некоторых моделях
Например, auth.models.User не версионируется, а Profileверсионируется. Не версионируются редко меняющиесяданные.
I Плюсы: лучше совместимость со стандартнымибиблиотеками, более привычная схема данных
I Минусы: половинчатое решение, все время нужнодумать о версионировании и переключаться
...32
..
Время и состояниеСуществующие решенияDocuments
На всех моделях
Отказ от стандартного пользователя и админки...I Минусы: начальный порог, реализация своего
пользователя (это не так сложно), немного меньшеподдержки ORM
I Плюсы: полное версионирование, о нем не надо думать!
...33
..
Время и состояниеСуществующие решенияDocuments
Use case: EAV-модель
I храним граф в реляционной БД (храним ребра)I минимальная схема (по одной модели на каждый тип
данных)I тривиальное кэширование в памятиI очень похожа на Datomic (Rich Hickey, создатель Clojure)
...34
..
Время и состояниеСуществующие решенияDocuments
Прореживание истории
I храним фиксированный периодI экспоненциальное прореживаниеI редко бывает проблемой
...35
..
Время и состояниеСуществующие решенияDocuments
За кадром
I интеграция с django-админкойI проверка целостности БДI работа с составными документами
...36
..
Время и состояниеСуществующие решенияDocuments
Основные принципы
I очень простое решение, нет магииI не боимся отказаться от некоторых привычных вещейI используем возможности БД
...37
..Время и состояниеСуществующие решенияDocuments
.
https://github.com/chtd/doc-versionsКонстантин Лопухин
[email protected]Вячеслав Федоров
... . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .