Argnist88
@Argnist88

Модель базы данных с историей изменений?

Требуется разработать модель базы данных (или хранилища данных), в которой бы хранилось не только актуальное состояние, как в обычных оперативных базах данных, но и вся история изменений любых атрибутов любой сущности по времени, чтобы знать все на любом временном срезе, как это делается с агрегированными данными в хранилищах данных. Но если атрибуты текстовые и агрегировать нечего, непонятно как строить такую модель. Что-то близкое к тому, что мне нужно, наверное, темпоральные базы данных. Хотелось бы узнать ссылки на книги, научные статьи, открытые проекты по этой тематике.
  • Вопрос задан
  • 7218 просмотров
Решения вопроса 1
zzr
@zzr
Ну что касается вообще хранения данных с историей в хранилищах, то можно начать со Slowly changing dimensions: wiki, соответственно, любая книжка по ХД будет содержать инфу по теме и, наверное, какой-нибудь из типов подойдёт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
tzlom
@tzlom
а не проще сохранять сделанные изменения в отдельную базу истории?
Ответ написан
Комментировать
@Cancel
Я когда-то этой темой занимался, она было очень популярна в девяностых. Но вот все источники растерял уже, к сожалению.
Ответ написан
ArthurG
@ArthurG
Можно сделать следующим образом, на самом верху абстракции сделать слой данных который будет скрывать всю работу с версиями. Таким образом Вы сможете работать с данными использую стандартные операции не заботясь о версиях.

Далее у нас остается только сущность (для простоты пусть будет одна и простая) и она может изменяться. Мы можем выбрать хранить копии или только изменения и при запросы вычислять нужное состояние.

В первом случае нам нужно хранить копии сущностей и вести учет версий, для этого достаточно в самой сущности определить такие данные и помечать последнюю версию, как итоговую.

Во втором случае будет нужен механизм вычисления изменений между версиями и собственно применения их к сущности, при запросе.

Самый простой сценарий. Взять последнюю версию сущности А, изменить и сохранить:
1) обращаемся к слою сервиса (ничего не знает о версиях) с запросом взять сущность А,
2) слой данных запрашивает сущность А и добавляет к запросу пункт о последней версии,
3) получает сущность и отдает сервису, который отдает её нам,
4) изменяем сущность и просим слой сервиса сохранить её,
5) слой данных помечает новую версию как последнюю, а со старой этот статус снимается.
6) сохраняются две сущности, но для нас это будет выглядеть как одна сущность, т.к. мы будем оперировать только одной сущностью.
Ответ написан
Комментировать
mgyk
@mgyk
CauchDB может быть подойдет. Она как раз хранит все изменения данные. К предыдущим значениям можно обращатся по номеру версии.
Ответ написан
Комментировать
Wott
@Wott
текстовые атрибуты как раз не проблема — смотрите в сторону DVCS там их быстро и компактно хранят diff-ами.
С прочими намного сложнее в плане компактности — приходиться хранить целиком.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы