Об информационной избыточности


Много лет назад ключевым походохом к хранению информации была эффективность с точки зрения оптимизации хранимого объема. Нормализованные модели данных позволяют хранить данные в максимально эффективном виде, также обновлять и поддерживать консистентность данных однако у этого подхода есть недостатки: если наша модель достаточно сложная, на получение данных для визуализации могут понадобиться десятки JOIN’ов

В современном мире ситуация изменилась:

  • Обычно цена за дополнительное место на сервере невелика.
  • Создание и поддержание дополнительных информационных моделей может быть затруднительно, но не настолько затруднительно, как например улучшение пользовательского опыта, когда ему приходится ждать лишее время на подгрузку данных.
  • OLAP базы данных дают широкий простор для организации одной и той же информации в разном представлении.

Очень часто гораздо лучше хранить больше информации, расплачиваясь местом на диске, и необходимостью иногда поддерживать расширенную модель данных. Такйо подход даёт нам больше свободы в том, как “доставлять” данные до конечного потребителя, ведь нам больше не нужно думать, сколько времени это займет, если эти данные будут подготовлены заранее.

Например, “широкие” пред-агрегированные таблицы позволяют избежать JOIN’ов и получать данные “напрямую”. Такие БД как Clickhouse, например, гораздо больше “заточены” под эту идею, и получение данных будет работать ощутимо быстрее. Например, если мы хотим визуализировать продажи продуктов по площадкам и продажи продуктов по регионам, то есть вероятность, что нам не стоит “собирать” эту информацию каждый раз, выбирая поле для GROUP BY (регион или площадка). Вместо этого, мы можем хранить 2 представления, каждое пред-агрегированное по соответствующему полю.

Materialized views в Clickhouse созданы специально таким образом, чтобы обновлять информацию параллельно с вставкой в источник данных, облечая таким образом, создание представлений под разничные нужды пользователя. Кроме того, Clickhouse поддерживает такие мощные инструменты, как AggregatingMergeTree, которые позволяют эффективно агрегировать такие данные, как средние значения.

Большинство современных БД представляют схожую возможность для создания подобных представлений, для схожих целем мы можем использовать триггеры в PostgreSQL.

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

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