У каждой системы есть свои нюансы и недостатки. R-keeper не исключение. Так как я работаю в направлении BI и основной источник — это R-keeper, то и проблема обновления данных для меня имеет достаточно высокий приоритет, так как не очень хорошо, когда в моих решениях некорректные/неактуальные данные.

Какие есть варианты загрузки данных из Кипера?

1. Решение «в лоб». Грузить данные из БД с самого начала.

Самый простой вариант и годится только для тестирования и быстрого прототипирования приложения. Скачал данные за нужный период, и сиди делай прототип. Но впоследствии всё равно нужно уходить от этого решения.

2. Догружать данные за последние несколько дней.

Если система работает корректно и данные в ней актуальны, то использование такого механизма будет достаточно для решения проблем с обновлением. Но у такого алгоритма есть важный нюанс. Если период возможного обновления данных значительный, то придётся постоянно тратить дополнительные ресурсы на выгрузку данных.

Встречал 2 варианта:

  • В скрипте прописать определённое число дней, и за данный период обновлять данные. В данном случае система будет работать сама без участия пользователя, но будут тратиться лишние ресурсы на обработку и выгрузку тех данных, которые корректны и не было необходимости их выгружать.
  • Проверять корректность данных, и вручную менять обновляемый период. Например раз в неделю. В данном же случае система должна работать быстрее так как период обновления может быть меньше, но человеческие трудозатраты тоже нужно учитывать.

3. Загрузка только обновлённых данных

Обновлять только те данные, которые были изменены — это лучшее решение, но трудозатратнее со стороны разработки.

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

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

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

Как реализовать инкрементальное обновление данных из R_Keeper?

  1. Определяем период для мониторинга. Например последние 2 месяца.
  2. Делаем 1 агрегированный запрос к SQL серверу.
  3. Сверяем результат запроса с контрольной матрицей.
  4. Если обнаружена разница на 0,01 по любому из показателей, данные за этот день обновляются.

Всё просто. Внедрение данного алгоритма позволило сократить время загрузки данных с 3 часов до 15 минут так как лишние данные не перегружаются, а загружаются только изменённые.