Как сохранять снапшоты?
От: bnk СССР http://unmanagedvisio.com/
Дата: 28.05.20 19:05
Оценка:
Есть система, состоящая из десятка таблиц.
Пользователи могут редактировать данные в этих таблицах.

Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")

Хочется чтобы было максимально просто, чтобы другие приложения (типа Power BI например) могли доставать историю своими силами,
без поддержки со стороны самой системы.

Какие есть эффективные методы создания такого?

Я думаю что простейший вариант — добавление колонки "снимок" во все таблицы, глобальной таблицы "снимки"
и кнопки "создать снимок", которая копирует текущие данные как новый "снимок"?

Можно сделать отдельные таблицы для "истории", но тогда придется над ними строить еще какое-то приложение,
которое будет из них получать данные по заданной дате, и это будет медленно.

Гуглил по ключевым словам "implement snapshots", или типа того.
Может кто что-то толковое посоветует (почитать)?
Re: Как сохранять снапшоты?
От: Maniacal Россия  
Дата: 28.05.20 19:28
Оценка: 7 (1)
Здравствуйте, bnk, Вы писали:


bnk>Есть система, состоящая из десятка таблиц.

bnk>Пользователи могут редактировать данные в этих таблицах.

bnk>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")


А если консольную утилиту из комплекта поставки БД вызвать и сделать дамп?
например для PostgreSQL
system("pg_dump dbname > outfile");

Для просмотра (если такое необходимо) его можно обратно восстановить, на в другую базу.
Re: Как сохранять снапшоты?
От: Mystic Artifact  
Дата: 28.05.20 20:08
Оценка: +1
Здравствуйте, bnk, Вы писали:

Задача не определяется из описания.

Тебе нужны периодические снэпшоты (например на каждое утро), или нужен доступ к снэпшоту на любое время в прошлом, или он делается только по требованию и как часто? А данных как много? (В плане как предлагалось выше в комментарии — скопировать тем или иным способом).

Исторические таблицы могут. Но, естественно, подходят ли они тебе — вопрос. Но мы то тут как раз и не знаем.
Re[2]: Как сохранять снапшоты?
От: bnk СССР http://unmanagedvisio.com/
Дата: 28.05.20 22:29
Оценка:
Здравствуйте, Maniacal, Вы писали:

bnk>>Есть система, состоящая из десятка таблиц.

bnk>>Пользователи могут редактировать данные в этих таблицах.

bnk>>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")


M>А если консольную утилиту из комплекта поставки БД вызвать и сделать дамп?

M>например для PostgreSQL
M>
M>system("pg_dump dbname > outfile");
M>

M>Для просмотра (если такое необходимо) его можно обратно восстановить, на в другую базу.

У меня речь то чтобы про бэкапы. Нужно эти данные (исторические) в общем предоставить "внешней" системе, заранее не известно какой.
Восстанавливать что-то из бэкапов для этого совсем не хочется.

"Снимки" делать раз в неделю, или раз в месяц. Данных не очень много (вводятся вручную) —
можно ориентироваться на тысячу записей в таблице "активных" данных.

Можно подумать над тем чтобы их еще куда усылать раз в неделю, но это вводит еще одну дополнительную "сущность"
Речь идет скорее не о разработке внутри компании, а о софте, который пользователь ставит сам.
Так что интеграция должна быть максимально просто.

Например если у него есть там упомянутый PowerBI или Qlick для показа данных.
Re: Как сохранять снапшоты?
От: RushDevion Россия  
Дата: 29.05.20 08:07
Оценка:
А если так.
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;
Re[3]: Как сохранять снапшоты?
От: MadHuman Россия  
Дата: 29.05.20 09:05
Оценка: +1
Здравствуйте, bnk, Вы писали:


bnk>У меня речь то чтобы про бэкапы. Нужно эти данные (исторические) в общем предоставить "внешней" системе, заранее не известно какой.

bnk>Восстанавливать что-то из бэкапов для этого совсем не хочется.
ну а чем снэпшот отличается от бакапа? по сути бакап — это и есть полный снэпшот базы на определённый момент.
в любом случае снэпшот (либо в кастомной форме внутри базы, либо в виде бакапа) будет занимать место.
бэкап просто лежит где-то рядом в отдельном файле или уже предразвернутый в другую базу и когда внешней системе надо доступ к историческим данным, её запросы редиректят на бакапную базу.
как вариант технически это может быть просто модифицируя только коннекшн-стринг.
вообщем-то вам надо проанализировать плюсы/минусы обоих подходов и выбрать более подходящий.
Re: Как сохранять снапшоты?
От: Milena США  
Дата: 30.05.20 14:19
Оценка: 24 (1)
Здравствуйте, bnk, Вы писали:


bnk>Есть система, состоящая из десятка таблиц.

bnk>Пользователи могут редактировать данные в этих таблицах.

bnk>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")


bnk>Хочется чтобы было максимально просто, чтобы другие приложения (типа Power BI например) могли доставать историю своими силами,

bnk>без поддержки со стороны самой системы.

bnk>Гуглил по ключевым словам "implement snapshots", или типа того.

bnk>Может кто что-то толковое посоветует (почитать)?

Обычно под аналитику (Power BI и т.д.) делают хранилище данных или data lake, где содержится вся история. Dimension tables категории SCD2 и SCD3 умеют хранить историю изменений в сущностях с атрибутами, а Fact tables хранят изменения в измерениях.

Есть какие-то причины, почему хранилище данных не рассматривается?
Re[2]: Как сохранять снапшоты?
От: bnk СССР http://unmanagedvisio.com/
Дата: 30.05.20 14:40
Оценка:
Здравствуйте, Milena, Вы писали:

M>Обычно под аналитику (Power BI и т.д.) делают хранилище данных или data lake, где содержится вся история. Dimension tables категории SCD2 и SCD3 умеют хранить историю изменений в сущностях с атрибутами, а Fact tables хранят изменения в измерениях.


M>Есть какие-то причины, почему хранилище данных не рассматривается?


Огромное спасибо за ликбез и ключевые слова :tumbup:

Поскольку система не на конкретном предприятии или проекте, хочется дать возможность системе аналитики пользователя извлекать исторические данные из нашей маленькой софтинки без напряга.
Re: Как сохранять снапшоты?
От: rm822 Россия  
Дата: 31.05.20 15:14
Оценка:
bnk>Хочется иметь состояние (всей) системы на определенный момент времени ("снимок")
в mssql из коробки есть
там же можно почитать как работает
https://docs.microsoft.com/ru-ru/sql/relational-databases/databases/database-snapshots-sql-server?view=sql-server-ver15
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.