Есть система, состоящая из десятка таблиц.
Пользователи могут редактировать данные в этих таблицах.
Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")
Хочется чтобы было максимально просто, чтобы другие приложения (типа Power BI например) могли доставать историю своими силами,
без поддержки со стороны самой системы.
Какие есть эффективные методы создания такого?
Я думаю что простейший вариант — добавление колонки "снимок" во все таблицы, глобальной таблицы "снимки"
и кнопки "создать снимок", которая копирует текущие данные как новый "снимок"?
Можно сделать отдельные таблицы для "истории", но тогда придется над ними строить еще какое-то приложение,
которое будет из них получать данные по заданной дате, и это будет медленно.
Гуглил по ключевым словам "implement snapshots", или типа того.
Может кто что-то толковое посоветует (почитать)?
bnk>Есть система, состоящая из десятка таблиц. bnk>Пользователи могут редактировать данные в этих таблицах.
bnk>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")
А если консольную утилиту из комплекта поставки БД вызвать и сделать дамп?
например для PostgreSQL
system("pg_dump dbname > outfile");
Для просмотра (если такое необходимо) его можно обратно восстановить, на в другую базу.
Тебе нужны периодические снэпшоты (например на каждое утро), или нужен доступ к снэпшоту на любое время в прошлом, или он делается только по требованию и как часто? А данных как много? (В плане как предлагалось выше в комментарии — скопировать тем или иным способом).
Исторические таблицы могут. Но, естественно, подходят ли они тебе — вопрос. Но мы то тут как раз и не знаем.
Здравствуйте, Maniacal, Вы писали:
bnk>>Есть система, состоящая из десятка таблиц. bnk>>Пользователи могут редактировать данные в этих таблицах.
bnk>>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")
M>А если консольную утилиту из комплекта поставки БД вызвать и сделать дамп? M>например для PostgreSQL M>
M>system("pg_dump dbname > outfile");
M>
M>Для просмотра (если такое необходимо) его можно обратно восстановить, на в другую базу.
У меня речь то чтобы про бэкапы. Нужно эти данные (исторические) в общем предоставить "внешней" системе, заранее не известно какой.
Восстанавливать что-то из бэкапов для этого совсем не хочется.
"Снимки" делать раз в неделю, или раз в месяц. Данных не очень много (вводятся вручную) —
можно ориентироваться на тысячу записей в таблице "активных" данных.
Можно подумать над тем чтобы их еще куда усылать раз в неделю, но это вводит еще одну дополнительную "сущность"
Речь идет скорее не о разработке внутри компании, а о софте, который пользователь ставит сам.
Так что интеграция должна быть максимально просто.
Например если у него есть там упомянутый PowerBI или Qlick для показа данных.
А если так.
1. Делаем новую схему (в каком-то виде это поддерживают все популярные реляционные БД), e.g. shapshot_YYYYMMDD
2. Даем пользователю права "только чтение" на эту схему
3. Воссоздаем в новой схеме структуру таблиц
CREATE TABLE shapshot_YYYYMMDD.new_table LIKE public.original_table;
4. Копируем данные
INSERT INTO shapshot_YYYYMMDD.new_table SELECT * FROM public.original_table;
bnk>У меня речь то чтобы про бэкапы. Нужно эти данные (исторические) в общем предоставить "внешней" системе, заранее не известно какой. bnk>Восстанавливать что-то из бэкапов для этого совсем не хочется.
ну а чем снэпшот отличается от бакапа? по сути бакап — это и есть полный снэпшот базы на определённый момент.
в любом случае снэпшот (либо в кастомной форме внутри базы, либо в виде бакапа) будет занимать место.
бэкап просто лежит где-то рядом в отдельном файле или уже предразвернутый в другую базу и когда внешней системе надо доступ к историческим данным, её запросы редиректят на бакапную базу.
как вариант технически это может быть просто модифицируя только коннекшн-стринг.
вообщем-то вам надо проанализировать плюсы/минусы обоих подходов и выбрать более подходящий.
bnk>Есть система, состоящая из десятка таблиц. bnk>Пользователи могут редактировать данные в этих таблицах.
bnk>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")
bnk>Хочется чтобы было максимально просто, чтобы другие приложения (типа Power BI например) могли доставать историю своими силами, bnk>без поддержки со стороны самой системы.
bnk>Гуглил по ключевым словам "implement snapshots", или типа того. bnk>Может кто что-то толковое посоветует (почитать)?
Обычно под аналитику (Power BI и т.д.) делают хранилище данных или data lake, где содержится вся история. Dimension tables категории SCD2 и SCD3 умеют хранить историю изменений в сущностях с атрибутами, а Fact tables хранят изменения в измерениях.
Есть какие-то причины, почему хранилище данных не рассматривается?
Здравствуйте, Milena, Вы писали:
M>Обычно под аналитику (Power BI и т.д.) делают хранилище данных или data lake, где содержится вся история. Dimension tables категории SCD2 и SCD3 умеют хранить историю изменений в сущностях с атрибутами, а Fact tables хранят изменения в измерениях.
M>Есть какие-то причины, почему хранилище данных не рассматривается?
Огромное спасибо за ликбез и ключевые слова :tumbup:
Поскольку система не на конкретном предприятии или проекте, хочется дать возможность системе аналитики пользователя извлекать исторические данные из нашей маленькой софтинки без напряга.