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

«Широкие» таблицы

Путь поиска баланса между простотой, производительностью и гибкостью начинался с «широких» (их также называют «плоских») таблиц, где вся информация хранится в единой структуре. Это была эпоха простоты: достаточно одного запроса — и все двести атрибутов пользователя оказывались у вас в руках. Процесс извлечения данных был быстрым и интуитивно понятным, поскольку обходился без сложных соединений и подзапросов.

Однако у этой простоты обнаружилась обратная сторона — избыточность. Представьте, что данные о сотрудниках и их работодателях хранятся в одной таблице. Если компания меняет название, то необходимо обновлять каждую запись, которая связана с изменяемой информацией. Это не только расточительно с точки зрения хранения, но и чревато аномалиями в данных. Также при увеличении количества данных в «широких плоских» таблицах возрастает и риск нарушения консистентности информации.

Поэтому появилась необходимость избавиться от таких ключевых проблем «широких» таблиц, как:

  1. Дублирование данных: Одна и та же информация (например, название компании, город, банкротство) повторяется для каждой записи всех сотрудников.

  2. Аномалии модификации: Любое изменение, добавление или удаление данных требует массовых операций, что влечет за собой риск для целостности информации и ресурснозатратно.

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

Это приводит нас к следующему этапу эволюции. 

«Звезда» и «Снежинка»

Ответом на проблемы широких таблиц стали нормализованные модели, такие как «Звезда» и её более строгая версия — «Снежинка». Логика «звезды» тесно связана с нашей лингвистической основой. Любое предложение, например, «Иванов купил в магазине № 5 колбасу», состоит из сущностей – Иванов, магазин, колбаса, и действия, которое их связывает – купил. В модели «звезда» таблица фактов (например, «Чек») — это и есть глагол, центральное событие, которое произошло. А окружающие ее таблицы измерений («Покупатели», «Магазины», «Товары») — это существительные, множества объектов, которые вовлечены в действие. «Снежинка» — это та же «Звезда», но таблицы измерений дополнительно нормализованы. Например, измерение «Товар» может быть разложено на отдельные таблицы «Категория товара», «Производитель» и «Бренд», образуя структуру, которая визуально напоминает снежинку.

Рассмотрим как  пример «человек работает в компании» эволюционирует от «плоской» таблице к «звезде».

Благодаря подобной декомпозиции появляется понятие нормализации – управление избыточностью с помощью свода правил - нормальных форм. Всего выделяют 11 нормальных форм. Основными считаются с 1НФ по 6НФ, также существуют промежуточные и альтернативные формы, которые устраняют конкретные виды избыточности. Например, НФБК (нормальная форма Бойса-Кодда) является усиленной версией 3НФ, а ДКНФ (доменно-ключевая нормальная форма) считается «идеальной», но труднодостижимой на практике. Ниже представлена таблица, которая отражает характеристики всех форм нормализации.

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

Несмотря на преимущества, «Звезда» и «Снежинка» столкнулись с трудностями. Они плохо приспособлены к частым изменениям в структуре источников данных. Добавление нового атрибута часто требовало перестройки всей модели, что делало процесс медленным и дорогим. Кроме того, эти модели не были идеальны для хранения полной истории изменений данных из операционных систем. Попытки сохранить историю изменений — например, каждый переезд клиента — приводили к  «раздуванию» таблиц измерений. Количество записей увеличивалось, актуальная информация терялась, а производительность падала. Это явление, иронично названное «взрывом звезды», наглядно демонстрировало, что классические модели достигли предела своих возможностей в мире, где данные должны не только храниться, но и рассказывать свою полную историю.

Data Vault

Ответом на эти проблемы стала модель Data Vault. Её философия заключается в гибкости и поглощении изменений из разных внешних источников. 

Базовые компоненты модели Data Vault:

  • Хабы (Hubs): Содержат только уникальные бизнес-ключи сущностей. Отвечают на вопросы «кто?» и «что?» в модели.

  • Связи (Links): Описывают взаимодействия между хабами, выполняя роль «глаголов» (например, «клиент совершил заказ»). Представляют собой транзакции, факты продаж или любые иные события.

  • Спутники (Satellites): Хранят все описательные атрибуты, их историю изменений и метаданные – время и источник поступления данных.

Покажем, как эта модель справлялась с историчностью и изменчивостью источников, когда их количество росло, структура менялась, а данные поступали из противоречащих друг другу  систем

Компании захотели хранить не только актуальное состояние данных, но и всю их историчность, чтобы отслеживать изменения объектов во времени. Чтобы реализовать эти процессы, используются механизмы Slowly Changing Dimensions (SCD) – медленно меняющихся измерений.

Пока существуют 7 типов SCD:

SCD 0: данные никогда не меняются после загрузки;

SCD 1: актуальные данные перезаписываются, история не сохраняется;

SCD 2: для каждого изменения создается новая запись с метками актуальности:

  • флаг актуальности;

  • дата начала;

  • флаг актуальности + дата начала;

  • дата начала + дата окончания;

  • флаг актуальности + дата начала + дата окончания

SCD 3: в строку добавляются отдельные колонки для хранения предыдущего значения атрибута;

SCD 4: история выносится в отдельную таблицу

SCD 5, 6, 7: являются гибридными комбинациями базовых (вышеперечисленных) типов.

Не существует «самого правильного» типа SCD. Выбор зависит от бизнес-требований к истории, объема данных и вычислительных ресурсов. Реализуем историчность с помощью SCD2. В нашем примере для таблицы satelite_company, которая хранит атрибуты компании -  ее наименовании и местоположении,  добавим дополнительные столбцы "Дата начала" и "Дата окончания" актуальности записей. Это позволит нам сохранить всю историю изменений названий и городов  компаний.

Однако при изменении одного из атрибутов, например, местоположения, создается новая запись с тем же наименованием. Таким образом, в таблице satellite_company появляется дублирующее значение: переезжая, компания повторяет данные о ее названии.  Более того, если не проанализировать всю историю изменений, невозможно сразу определить, что именно менялось - наименование компании или ее местоположение. Каждая новая версия строки отражает изменение любого из ее атрибутов, без указания, какой именно был обновлен. Если  предположить, что Наименование  будет меняться крайне редко, а из одного города в другой можно переезжать довольно часто, то было бы логично разделить таблицу satellite_company на две новых таблицы: satellite_name_company - для хранения наименования компании и satellite_city_company - для хранения месторасположения компании.

То есть для эффективного сохранения данных с разным периодом изменения лучше сделать отдельные спутники.

Кроме того, эпоха микросервисной архитектуры привела к взрывному росту количества источников данных: вместо одного монолитного источника аналитикам пришлось работать с десятками разнородных систем, каждая из которых имела свою базу данных. Предположим, что для таблицы satellite_person данные поступают из разных отделов: ФИ и Дата Рождения из HR-отдела, а паспортные данные из системы безопасности. Такая ситуация может привести к конфликтам загрузки и падению производительности. Поэтому второй принцип, которого стоит придерживаться – разделение по источникам. 

Ключевое преимущество Data Vault заключается в том, что новые источники данных или изменения в атрибутах интегрируются путем добавления новых сущностей, без необходимости изменять существующую структуру. Это делает данную модель идеальным решением для сред с высокой изменчивостью источников и строгими требованиями к аудиту и отслеживанию данных.

Якорная модель (Anchor Modeling)

Следующим шагом в этой эволюции стала якорная модель (Anchor Modeling), которую можно рассматривать как Data Vault, доведенный до шестой нормальной формы. Состоит из:

  • Якоря (Anchors): Представляют собой фундаментальные бизнес-сущности и содержат только их уникальные идентификаторы, являясь структурным скелетом модели.

  • Атрибуты (Attributes): Хранят все описательные данные и их историю изменений в виде отдельных таблиц, каждая из которых напрямую связана с якорем.

  • Связки (Ties): Фиксируют отношения и события между несколькими якорями, определяя их взаимосвязи в конкретный момент времени.

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

Как выбрать модель данных для вашего проекта?

Чтобы сделать осознанный выбор, задайте несколько вопросов, например:

Каковы цели и требования к данным?

·      Скорость разработки и простота: Широкая таблица или «звезда»

·      Полный аудит и трассируемость: Data Vault или Якорная модель

·      Воспроизводимость и историчность: Data Vault

Какова природа и объем данных?

·      Стабильные, предсказуемые данные: «Звезда» или «снежинка»

·      Быстрорастущие, неструктурированные потоки: Data Vault

·      Очень большие объемы, требующие экономии места: Якорная модель

Насколько сложна архитектура источников?

·      Один-два стабильных источника: «Звезда»

·      Десятки микросервисов с частыми изменениями: Data Vault

·      Экосистема с постоянно меняющейся структурой: Якорная модель

Какие ресурсы и экспертиза есть в команде?

·      Небольшая команда, нужна простота: Широкая таблица

·      Опыт в классическом BI: «Звезда»

·      Экспертиза в интеграции данных и готовность к сложности: Data Vault

·      Специализированная команда для долгосрочных сложных проектов: Якорная модель

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

Практические примеры выбора модели

Давайте рассмотрим, как эти принципы работают на практике:

Пример 1: Крупный банк

  1. Контекст: Десятки источников (кредиты, карты, вклады), жёсткие требования регуляторов, необходимость знать, кто и когда изменил каждое поле.

  2. Проблема: изменчивость источников, нужен полный аудит.

  3. Выбор: Data Vault. Модель позволяет гибко добавлять новые сущности, сохраняя всю историю изменений для отчётности перед регуляторами. Якорная модель была бы избыточна и слишком сложна для поддержки.

Пример 2: Быстрорастущий стартап

  1. Контекст: Небольшая команда, продукт постоянно меняется, метрики для проверки гипотез вводятся и отменяются каждую неделю.

  2. Проблема: Скорость разработки и простота важнее идеальной структуры.

  3. Выбор: «Широкая» таблица (витрина данных). Это позволит быстро доставлять данные менеджерам для анализа. Нормализация и сложные модели только замедлили бы итерационный процесс.

Пример 3: Научно-исследовательский проект (геномика)

  1. Контекст: Десятки лабораторий по всему миру, тысячи приборов, генерирующих терабайты данных. Проект рассчитан на 20 лет. Критически важна воспроизводимость экспериментов.

  2. Проблема: Необходимость хранить эволюцию самой модели данных и всех параметров.

  3. Выбор: Якорная модель. Она гарантирует, что через 10 лет можно будет точно воссоздать условия старого эксперимента, так как каждый атрибут и его история сохраняются независимо. Сложность запросов — приемлемая цена за научную достоверность.

Пример 4: Классический ритейл

  1. Контекст: Стабильные процессы, два основных источника (склад, продажи), команда с опытом классического подхода к моделированию. Цель — стандартные отчёты по продажам и запасам.

  2. Проблема: Предсказуемость и производительность отчётов.

  3. Выбор: «Звезда». Это проверенная модель, которая обеспечивает высокую скорость выполнения запросов для предсказуемых бизнес-вопросов и проста для понимания бизнес-пользователями.

Таким образом, не существует «лучшей» модели данных. Эволюция моделей — это история о поиске оптимального инструмента для управления самым ценным ресурсом — данными. Правильный выбор определяется конкретным контекстом, а не модой на технологии. От стартапа, где важна скорость, до научного проекта, где критична точность, — каждая модель находит своё идеальное применение.

Комментарии (0)