информацию Кто может сказать, что было вчера после обеда? Кто может сказать, что произошло за последние 5 минут? Кто видел простое кэширование запросов к БД? . . . 9
решение Невозможно принять решение при постоянном изменении данных. Мы хотим получить согласованное состояние: сравнивая данные из нескольких источников несколько раз смотря на данные из одного источника . . . 10
(1) start transaction read a bunch of data ... long computation ... read more data ... more computation end transaction Deadlocks вся логика наизнанку производительность . . . 11
отдельная поддержка массовых операций видим лишь отдельные версии документов (и то с трудом) не можем искать по истории - история это текст поддержка массовых операций (update, delete) . . . 16
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
Мы легко можем получить версии в любой момент времени: model.now.filter(...) # транслируется в dt = retrospection.now() model.objects.filter(document_start__lte=dt, document_end__gt=dt) .filter(...) . . . 22
Один документ хранится в нескольких моделях. Документы ссылаются друг на друга. Виды ссылок между документами: на версию, действующую в момент создания: при помощи id на версию, действующую в текущий момент времени: при помощи document_id . . . 31
моделях Например, auth.models.User не версионируется, а Profile версионируется. Не версионируются редко меняющиеся данные. Плюсы: лучше совместимость со стандартными библиотеками, более привычная схема данных Минусы: половинчатое решение, все время нужно думать о версионировании и переключаться . . . 32
моделях Отказ от стандартного пользователя и админки... Минусы: начальный порог, реализация своего пользователя (это не так сложно), немного меньше поддержки ORM Плюсы: полное версионирование, о нем не надо думать! . . . 33
EAV-модель храним граф в реляционной БД (храним ребра) минимальная схема (по одной модели на каждый тип данных) тривиальное кэширование в памяти очень похожа на Datomic (Rich Hickey, создатель Clojure) . . . 34