У меня есть требование хранить все версии сущности в легко индексируемом виде, и мне было интересно, есть ли у кого-нибудь информация о том, какую систему использовать.
Без управления версиями система представляет собой просто реляционную базу данных со строкой, например, на человека. Если состояние человека меняется, эта строка изменяется, чтобы отразить это. При управлении версиями запись должна обновляться таким образом, чтобы мы всегда могли вернуться к предыдущей версии. Если бы я мог использовать временную базу данных, это было бы бесплатно, и я мог бы спросить: «Каково состояние всех людей по состоянию на вчерашний день в 14:00, живущих в Дублине и в возрасте 30 лет». К сожалению, не существует зрелых проектов с открытым исходным кодом, которые могли бы делать временные действия.
Действительно неприятный способ сделать это - просто вставить новую строку для каждого изменения состояния. Это приводит к дублированию, поскольку у человека может быть много полей, но только одно изменение на обновление. Кроме того, тогда довольно медленно выбирается правильная версия для каждого человека с заданной отметкой времени.
Теоретически должно быть возможно использовать реляционную базу данных и систему управления версиями для имитации временной базы данных, но это звучит довольно ужасно.
Так мне было интересно, сталкивался ли кто-нибудь с чем-то подобным раньше и как они к нему подошли?
Обновление
Как подсказал Аарон, вот запрос, который мы сейчас используем (в mysql). Это определенно медленно на нашей таблице с> 200 тыс. Строк. (id = ключ таблицы, person_id = id на человека, дублируется, если у человека много ревизий)
выберите имя от лица p, где p.id = (выберите max (id) от лица, где person_id = p.person_id и отметка времени <=: отметка времени) </p>
Обновление
Похоже, что лучший способ сделать это - использовать временную базу данных, но, учитывая, что там нет открытых источников, следующий лучший способ - сохранить новую строку для каждого обновления. Единственная проблема - дублирование неизмененных столбцов и медленный запрос.