Разработка BI инструмента. Часть 1. Формирование модели.

Разработка BI инструмента. Часть 1. Формирование модели

Вступление

    Различные BI инструменты появляются с целью решения проблем с аналитикой данных целых корпораций и пользуются спросом. 
Вот и я, работая в компании, из-за отсутствия задач был вынужден ознакомиться с одним из таких для формирования недельной отчетности. Инструмент мне понравился и показался довольно удобным, но со временем я начал замечать все большее количество недостатков и в итоге решил разработать собственный для анализа данных с медицинскими замерами.
    Данный опыт для меня будет сколь новым, столь интересным и познавательным. Поэтому в цикле следующих статей я планирую описывать шаги, контрольные точки а также интересные наблюдения с которыми столкнулся в процессе разработки. 

    Формирование структуры проекта

Итак, первоначальная схема у меня сформировалась следующая: 

На вид довольно элементарно и даже канонично, теперь же постараюсь описать основную бизнес-логику:

В Базе BigData планируется хранить массивные данные сессий исследований над пациентом. Это могут быть результаты ЭКГ, ЭЭГ, замеры движений глаз и т.п. Вот пример такой структуры с результатами электроокулографии левого и правого глаза:


Размер такой таблицы напрямую зависит от длительности сессии и может варьироваться от 150 тыс. до 1 млн. строк. Также стоит учитывать что измерения могут проводится параллельно и в одной сессии могут быть как данные с ЭЭГ, так и с ЭКГ. Несомненно потребуется возможность параллельного чтения и анализа этих данных для установления взаимного влияния друг на друга.   

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

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

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

Фронтенд и бэкенд будут взаимодействовать посредством RestAPI. Однако в этой области планирую провести сравнение и анализ gRPC.

    Список инструментов

Думаю теперь пора нарастить скелет мышцами в виде стека инструментов которыми буду решать задачу. Постараюсь описать, и в будущих очерках сравнить с другими и  оценить правильность тот или иных выборов.  

БД для BigData

В данной категории из всего списка доступных СУБД решил сузить круг до двух претендентов:

  • MongoDB

  • ClickHouse

Обе базы имеют множество преимуществ и работают совершенно по-разному, поэтому детально сравнивать их сейчас будет не совсем корректно. 

С одной стороны MongoDB выглядит более простым и развитым решением, которое имеющим объемную документальную базу и обширное комьюнити, что несомненно упростит и ускорит процесс разработки.

С другой стороны колоночная CliсkHouse является отличным выбором для аналитической БД с превосходной скоростью чтения и привычным SQL. Однако мне известно немного и в следующих статьях планирую провести ее анализ и сравнение с MongoDB в рамках моей задачи.

БД для бэкенда

  • PostgreSQL


    Из-за уже имеющегося опыта работы с данной БД и из-за того что она является не просто реляционной, а объектно-реляционной, позволит формировать более гибкие и структурированные запросы. Также поддержка большого количества типов данных, включая массивы и json не будет лишней. Ну и конечно наличие хорошей документации.


Бэкенд

  • Django

Не являясь веб-разработчиком и плохо зная javascript решил выбрать бэкенд на языке программирования к которому привык больше всего. Выбор был между двумя самыми популярными Django и Flask. Остановился на первом в связи с наличием структуры MVC и поддержкой нескольких баз данных. Явных перевесов в рамках текущего проекта пока не нашел. Обе системы по-своему гибкие и для решения задачи имеют место. А информация о том что на Django стоят такие гиганты как YouTube или Instagram сыграла в пользу этого бэкенда.


Фронтенд

  • Flutter

Опять же не являясь веб-разработчиком и плохо зная HTML + CSS пришел к выводу, что Flutter наиболее оптимальный вариант для меня. Несмотря на относительно небольшой возраст, язык Dart довольно приятен в использовании и работа на нем после Python не ощущается тяжелой. Кроссплатформенность SDK Flutter является одним из ключевых преимуществ. Сам интерфейс прописывается в коде, что делает грань между логикой и дизайном почти незаметной в результате чего решение ощущается более целостным и органичным. А при необходимости интерфейс с легкостью разбивается на отдельные модули. Ну а собственный графический движок и активное развитие платформы также немаловажный показатель.

    Итоги

В результате анализа моя схема приобретает обрастает деталями и приобретает следующий вид: