ГЛАВА 5 – Intermediate Моделирование Data Vault
Вспомним про структуру Data Vault и ключевые термины
Этот раздел не является частью книги, он содержит краткую выдержку по структуре Data Vault (для того, чтобы освежить в памяти структуру DV и основные термины).
Структура Data Vault
- Raw Data Vault — это сырой слой данных, где хранятся исходные данные:
- HUB — таблица, содержащая связку бизнес-ключа сущности и суррогатного ключа хранилища
- LINK — таблица связей сущностей по суррогатным ключам
- SAT — таблица атрибутов сущности
- Business Vault — содержит бизнес-правила и преобразования, применяемые к исходным данным:
- SAL — таблицы унификации ключей сущности
- PIT — таблица расчета полной истории сущности (опционально)
- Bridge/Calculation tables — таблицы с любыми видами расчетов
- Information Mart / Data Mart — это аналитический слой данных. Он предназначен для построения отчётов и визуализации данных для пользователей.
- Генерация ключей
- Sequence — надежно и синхронно
- Hash — коллизии и ассинхрон (шанс коллизии у md5 50% на 2^64 записей). Используем hash, если у вас нет явных требований на 100% точность в DWH. А если они есть, переубеждаем тех, кто их поставил.
Пример связей между таблицами:
Презентация с конференции SmartData 2024 Data Vault.
Переводы 1-4 глав книги по Data Vault 2.0:
- Перевод 1 Главы — Введение в хранилища данных
- Перевод 2 Главы — Масштабируемая архитектура хранилища данных
- Перевод 3 Главы — Методология Data Vault 2.0
- Перевод 4 Главы — Моделирование Data Vault 2.0 — Что такое Hub / Link / Satellite?
Аннотация к главе 5
В этой главе рассматриваются более сложные сущности Data Vault. Они расширяют базовые сущности. Здесь будут затронуты различные специальные типы спутников (Satellite), включая:
- перегруженные спутники (Overloaded Satellites),
- мультиактивные спутники (Multi-Active Satellites),
- спутники отслеживания статуса (Status-Tracking Satellites),
- спутники актуальности (Effectivity Satellites),
- спутники отслеживания записей (Record Tracking Satellites) и
- вычисляемые спутники (Computed Satellites).
Также рассматриваются расширенные сущности связей, включая связи между связями (link-to-link), связи «same-as» (same-as links), иерархические связи, неисторические связи (nonhistorized links), недескриптивные связи, вычисляемые агрегатные связи и исследовательские связи.
Для каждой сущности связи будет объяснена техническая или бизнес-причина её добавления в Data Vault.
Ключевые слова:
- хранилище данных
- data vault
- спутники
- сущности связей
- моделирование данных
Типы сущностей, представленные в предыдущей главе, являются основой для других сущностей Data Vault, представленных в этой главе. Многие из этих примеров — это просто применения существующих сущностей связи или спутников без изменения структуры самой сущности. Они часто используются в Business Vault.
Применение хабов
Глава 4, Моделирование Data Vault 2.0, представила хабы Data Vault как центральные сущности, используемые для хранения бизнес-ключей, идентифицирующих бизнес-объекты. В теории в предприятии должна быть одна ведущая операционная система, отслеживающая конкретный бизнес-объект.
Системы управления взаимоотношениями с клиентами (CRM) являются хорошими примерами таких операционных систем, которые являются основным источником всей информации, связанной с клиентами. Однако на практике бизнес-объекты, такие как клиенты, хранятся в нескольких операционных системах, например, в ритейл-базах данных, e-commerce приложениях, системах управления счетами и так далее. Предприятия пытаются консолидировать эту информацию с помощью концепции, называемой управлением мастер-данными (master data management).
На Рисунке 5.1 показано, что все данные, включая бизнес-ключи, сначала загружаются в слой Data Vault через staging-область. Консолидация происходит при обработке сложных бизнес-правил и построении витрин данных (information marts). Специалисты по хранилищам данных сталкиваются с множественными источниками для одного и того же бизнес-объекта.
Основная проблема при наличии нескольких источников заключается в том, что каждый из них имеет различные возможности по определению бизнес-объекта. Это связано с тем, что в момент создания этих систем в прошлом бизнес выдвигал к ним разные требования. В результате даже типы данных бизнес-ключей могут отличаться: в некоторых случаях буквенно-цифровой номер клиента (например, US4317 для клиента из США), определённый на уровне предприятия, не может быть использован в другой операционной системе, поскольку она не допускает буквенные символы в номере клиента. В таком случае бизнес будет полагаться на какие-либо маппинговые таблицы, которые отображают клиента US4317 из CRM-системы в клиента 132842 в e-commerce приложении.
Рисунок 5.1 Консолидация различных источников в хранилище данных
Поскольку такая ситуация встречается чаще всего, в Data Vault предусмотрено решение. Рекомендуемая практика — загружать все бизнес-ключи, независимо от их конкретного формата, в один общий хаб (в данном случае — хаб клиентов) и создавать специальную связь, называемую same-as link (SAL), чтобы указать бизнес-ключи, которые идентифицируют один и тот же бизнес-объект.
Консолидация бизнес-ключей
Business Vault представляет собой расширение Data Vault RAW и позволяет разработчикам хранилищ данных добавлять вычисляемые данные в слой Data Vault. В этой главе будут представлены вычисляемые агрегатные связи (computed aggregate links), исследовательские связи (exploration links) и вычисляемые спутники (computed satellites) в качестве примеров типов сущностей, входящих в состав Business Vault. Эти типы сущностей моделируются аналогично основным сущностям Data Vault, следуя концепциям моделирования Data Vault, особенно для связей и спутников.
Тем не менее, каждую стандартную сущность Data Vault можно кастомизировать в соответствии с потребностями организации. Эти модификации, которые становятся частью Business Vault, получают данные из стандартных сущностей сырого (RAW) Data Vault (хабы, связи и спутники) и часто оптимизируются для повышения производительности при выполнении запросов к данным в Data Vault.
Распространённый вариант использования — консолидация бизнес-ключей из различных источников, как показано в Таблицах 5.1 и 5.2 и на Рисунке 5.2.
Таблица 5.1 Хаб «Пассажир»
Passenger HashKey | Load Date | Record Source | Passenger Number |
---|---|---|---|
8473d2a… | 2014-06-26 | DomesticFlight | 1234 |
9d8e72a… | 2014-06-26 | DomesticFlight | 1257 |
1a4e2c2… | 2014-06-26 | InternationalFlight | C21X9 |
238aaff… | 2014-06-26 | InternationalFlight | C43Z8 |
Таблица 5.2 Same-as-Link для пассажира
SALPassenger HashKey | Load Date | Record Source | Master Passenger HashKey | Duplicate Passenger HashKey |
---|---|---|---|---|
38dfa8… | 2014-06-26 | Dedupe | 238aaff… | 8473d2a… |
937aae… | 2014-06-26 | Dedupe | 1a4e2c2… | 9d8e72a… |
Рисунок 5.2 Хаб со структурой Same-as-Link (SAL) для устранения дубликатов бизнес-ключей пассажиров
В данном случае в сыром Data Vault существует хаб (hub) Passenger, получаемый из нескольких исходных таблиц, содержащих номера пассажиров. Во многих организациях используются исходные системы, которые не интегрированы между собой. В результате один и тот же пассажир может присутствовать в нескольких операционных системах с разными идентификаторами (например, номер водительского удостоверения или номер паспорта). Ещё одной причиной данной проблемы является поддержка различными системами разных форматов для одного и того же бизнес-ключа.
В этом примере исходная система Domestic Flight допускает (и использует) только числовые номера водительских удостоверений, в то время как система International Flight допускает буквенно-цифровые бизнес-ключи. Такая ситуация далека от идеальной, но часто возникает, когда две организации объединяются и продолжают использовать свои старые системы без должной интеграции.
Проблема решается путём добавления к хабу структуры Same-as-Link (SAL), которая указывает, какие номера клиентов соответствуют одному и тому же клиенту. Существует несколько способов вычислить записи для Same-as-Link, и они могут быть результатом алгоритмов дедупликации клиентов, как в данном примере. Соответствующая диаграмма «сущность-связь» (ER-диаграмма) представлена на Рисунке 5.3.
Рисунок 5.3 ER-диаграмма структуры Same-as-Link для устранения дубликатов бизнес-ключей пассажиров (физическая модель)
Этот подход, основанный на Same-as-Link и хабе с единственным бизнес-ключом, работает только в том случае, если диапазоны значений ключей в обеих системах не пересекаются. Если же они пересекаются, один и тот же бизнес-ключ может идентифицировать разные бизнес-объекты в разных системах. Вместо того чтобы использовать один хаб для всех бизнес-ключей из всех исходных систем в сыром Data Vault, существует два варианта решения этой ситуации.
Во-первых, можно расширить хаб, добавив ещё один бизнес-ключ, идентифицирующий систему-источник. Этот искусственный ключ становится частью составного бизнес-ключа хаба. Недостатком этого решения является то, что оно не приводит к интеграции исходных систем.
Другой вариант — создать несколько хабов и связать их между собой с помощью таблицы связей (link). Это решение документирует различное использование бизнес-ключей в модели, но требует создания большего числа сущностей в сыром Data Vault.
С точки зрения моделирования оба решения далеки от идеала, но они отражают реальное использование бизнес-ключей в системах-источниках и бизнес-практиках. Однако в обоих случаях это правильный подход, поскольку моделирование в Data Vault 2.0 ориентировано на бизнес. Если организация использует неидеальные методы ведения бизнеса, это также должно быть отражено в модели Data Vault.
Когда данные трансформируются в Business Vault, всё ещё возможно объединить бизнес-ключи в одном бизнес-хабе, включая структуру Same-as-Link, как показано на Рисунке 5.3. На самом деле, Same-as-Link является сущностью Business Vault, при условии, что информация не извлекается напрямую из системы-источника, а поддерживается вручную или с помощью алгоритмов. Однако если бизнес-ключи объединяются в бизнес-хаб, они не должны пересекаться и должны идентифицировать только один бизнес-объект. Это соответствует стандарту Data Vault 2.0 и может быть достигнуто с помощью префиксов или постфиксов (или форматирующих элементов) для бизнес-ключей, которые не поступают из ведущей системы-источника.
Например, если ведущей системой является CRM-приложение и оно не предоставляет бизнес-ключ для конкретного бизнес-объекта, идентифицирующий бизнес-ключ берётся из вторичной системы-источника и загружается в бизнес-хаб. Примером такой вторичной системы может быть система тикетов (ticketing), где клиент был добавлен, но никогда не синхронизировался и не реплицировался в CRM-приложение. Чтобы указать на этот неидеальный случай и избежать путаницы, бизнес-ключ из ticketing-системы заключают в скобки, например, “(4711)”. Этот бизнес-ключ затем используется в аналитических отчётах, и бизнес-пользователю становится очевидно, что ключ не из CRM-системы и его там не найти. Также возможно добавлять к ключу имя системы-источника, например, “(TCK:4711)”, чтобы пользователь знал, откуда поступил данный ключ.
Запросы к таким двум таблицам в некоторых случаях могут быть довольно сложными. Кроме того, в большинстве случаев бизнесу требуется консолидированный вид клиентских номеров, а не сырые данные — за исключением случаев анализа качества данных. Поэтому целесообразно предоставить консолидированный список, получаемый в результате сложного запроса, в виде нового материализованного хаба. Этот хаб имеет ту же структуру, что и хаб в сыром Data Vault, но содержит другие данные. Таким образом, утверждение из начала этого раздела остаётся верным: в Business Vault нет специальной сущности типа «хаб». Однако логично создавать хабы Business Vault, чтобы предоставлять разные наборы бизнес-ключей и улучшать последующую выборку данных. В этом случае атрибут record source изменяется на “SYSTEM” или “SYS”, чтобы указать, что значение было сгенерировано системой хранилища данных.
Этот пример является типичным случаем, когда бизнес-правила применяются в Business Vault. Хотя бизнес-правила обычно реализуются при загрузке витрин данных, хорошей практикой является их реализация в Business Vault, если они используются более чем в 80% отчётов или если их выполнение требует значительных ресурсов. В данном случае «heavy lifting» означает долгие по времени или сложные бизнес-правила. Таким образом можно избежать повторной реализации бизнес-правил для каждой витрины данных. Это становится особенно важным в случае сложных и ресурсоёмких правил, которые используются в нескольких витринах.
Глава 6, Продвинутое моделирование Data Vault, рассматривает ещё две сущности Business Vault (таблицу PIT и таблицу bridge), которые используются для упрощения запросов к данным из сырого Data Vault и повышения производительности запросов. По этой причине они также называются query assistant tables (вспомогательные таблицы для запросов).
Применение связей (Link Applications)
В следующих разделах представлены распространённые структуры связей и сценарии их применения, которые специалисты по Data Vault часто используют в своих проектах.
Link-on-link
Один из часто задаваемых вопросов на этапе проектирования Data Vault — возможно ли создание связей, которые ссылаются на другие связи (так называемые структуры link-on-link).
Рассмотрим пример отклонения рейса в авиационной отрасли. Вместо того чтобы прибыть в исходный аэропорт, рейс перенаправляется из-за неблагоприятных погодных условий или инцидента, связанного с безопасностью. Первая идея по моделированию этой ситуации в Data Vault представлена на логической схеме на рисунке 5.4.
Рисунок 5.4 Логическая модель Data Vault с link-on-link структурой
Связь в центре модели LinkFlight представляет собой исходную информацию о рейсе, запланированную авиаперевозчиком. Каждый рейс имеет исходный и конечный аэропорт (поэтому LinkFlight связан дважды с HubAirport), а также ссылку на номер рейса и номер борта. Обратите внимание, что на схеме не показаны спутники.
Отклонение рейса моделируется как ещё одна связь — LinkDiversionFlight. Она ссылается на исходный рейс в LinkFlight и добавляет ссылку на новый аэропорт прибытия. Хотя эта модель выглядит достаточно эффективной, она вводит нежелательную зависимость между двумя связями. Такая зависимость плохо масштабируется и не обеспечивает должной производительности в условиях высоких объёмов и скоростей обработки данных (big data).
Чем больше подобных link-to-link структур необходимо обработать на уровне СУБД, тем более экспоненциальным становится объём работы для неё. Для обеспечения гибкости и масштабируемости с большими объёмами данных модель необходимо перепроектировать на раннем этапе.
Функциональность, необходимая бизнес-пользователю, поставляется итеративно в рамках отдельных спринтов. Цель — поставлять небольшие инкременты хранилища данных и внедрять эти изменения в продакшн по завершении каждого спринта. Проблема с link-to-link структурами в том, что изменение родительской связи (в данном случае LinkFlight) требует изменения всех зависимых дочерних связей (например, LinkDiversionFlight).
Такие каскадные изменения увеличивают время, необходимое на модификацию компонентов хранилища данных по запросу на изменение, и могут не позволить завершить внедрение запроса в рамках одного спринта. Следовательно, подобные связи следует избегать для сохранения гибкости команды ИТ. Рекомендуемая практика — отказаться от ссылок между связями и реализовать связи независимо (см. рисунок 5.5); в кругах моделирования данных это известно как денормализация.
Рисунок 5.5 Логическая модель с независимыми связями
Теперь каждая связь является независимой и может изменяться отдельно в случае необходимости изменений в её структуре в будущем.
Same-as Links (SAL)
Same-as-Link используются для указания на дублирующиеся бизнес-ключи внутри сущности хаба в Data Vault. Это необходимо в случаях, когда один и тот же бизнес-объект идентифицируется несколькими бизнес-ключами.
Например, в таблице 5.3 представлен фрагмент списка клиентов, загруженного из различных источников.
Таблица 5.3 Хаб клиентов (Customer Hub)
# | CustomerHashKey | LoadDate | RecordSource | CustomerNo |
---|---|---|---|---|
1 | b7b0a554b9… | 2014-01-17 08:20:15.000 | CRM | DE4711 |
2 | dd2c1f2d8d… | 2014-01-17 08:20:15.000 | CRM | US4317 |
3 | e138c1d3c9c… | 2014-01-17 08:20:15.000 | CRM | UK8876 |
4 | d1360901d7… | 2014-01-17 09:05:43.000 | SHOP | 764912 |
5 | 74b3a3c01… | 2014-01-17 09:05:43.000 | SHOP | 124784 |
6 | a11593aea… | 2014-01-17 09:05:43.000 | SHOP | 132842 |
Хаб был загружен из нескольких источников, использующих разные форматы хранения номера клиента. В то время как CRM-система хранит клиентские номера как составной ключ (так называемый “smart-key”), интернет-магазин способен хранить только числовые значения для клиентских номеров. Поэтому бизнес предоставляет таблицу сопоставления между номерами клиентов в CRM-системе и системе интернет-магазина (таблица 5.4).
Таблица 5.4 Сопоставление клиентских номеров между системами-источниками
CRM Customer Number | SHOP Customer Number |
---|---|
DE4711 | 124784 |
US4317 | 132842 |
UK8876 | 764912 |
Имея таблицу соответствия клиентских номеров, можно создать структуру связи, изображённую на рисунке 5.6.
Рисунок 5.6 Физическая модель Same-as-Link для клиентов
Эта связь заполняется записями, подобными тем, что представлены в таблице 5.5.
Таблица 5.5 Same-as-Link для клиентских номеров
# | SAICustomerHashKey | LoadDate | RecordSource | CustomerMasterHashKey | CustomerDuplicateHashKey |
---|---|---|---|---|---|
1 | c5cd634e4a… {DE4711;124784} | 2014-01-17 09:08:27.000 | MDM | b7b0a554b9… {DE4711} | 74f33a3c01… {124784} |
2 | 69777c1b5b… {US4317;132842} | 2014-01-17 09:08:27.000 | MDM | dd2c1f2d8d… {US4317} | a11593aeaa… {132842} |
3 | ae7324fa23… {UK8876;764912} | 2014-01-17 09:08:27.000 | MDM | e138c1d3c9… {UK8876} | d1360901d7… {764912} |
С точки зрения загрузки данных, хэш-ключи в столбце CustomerMasterHashKey должны формироваться на основе ключей из ведущей (master) системы — например, CRM. Это позволяет выполнять поиск клиентского номера из системы интернет-магазина (SHOP) путём выборки записи из таблицы Same-as-Link, где Customer1HashKey соответствует номеру из CRM. Таким образом обеспечивается консолидация клиентских идентификаторов при анализе данных.
Иерархические связи (Hierarchical Links)
Иерархические связи используются для моделирования отношений родитель-дочерний в Data Vault. Один из распространённых примеров — иерархия спецификаций (BOM, bill of materials), описывающая, из каких деталей состоит изделие. Например, самолёт состоит из компонентов, представленных на рисунке 5.7.
Рисунок 5.7 Части самолёта
Каждая часть самолёта состоит из других, более мелких деталей. Компоненты типового турбореактивного двигателя изображены на рисунке 5.8. Все они оформлены в структуре спецификаций (BOM), показанной на рисунке 5.9.
Рисунок 5.8 Сечение турбореактивного двигателя
Рисунок 5.9 Структура спецификации (BOM)
Каждый элемент BOM имеет название, номер детали, количество, необходимое для сборки, и указание источника.
Модель Data Vault для представления такой иерархии приведена на рисунке 5.10.
Рисунок 5.10 Логическая модель иерархической связи
Вместо того чтобы моделировать каждый уровень иерархии отдельным хабом, предпочтительно создать один хаб, поскольку бизнес рассматривает уровни иерархии как однотипные. С технической точки зрения они могут иметь разную степень детализации/гранулярности, но в бизнес-контексте каждый уровень — это просто часть иерархии.
Таким образом, иерархическая связь — это просто применение стандартной связи (link) в Data Vault. Она не нарушает модель и не требует особых правил.
Неисторические связи (Nonhistorized Links)
Все предыдущие примеры связей сохраняют историю отношений между бизнес-объектами. Обычно, если что-то изменилось в источнике, это отражается добавлением новой версии в спутник (satellite). Однако бывают ситуации, когда данные не должны быть изменены вообще — например, транзакционные данные или данные с датчиков. В таких случаях используется неисторическая связь.
Это особый тип связи, также называемый транзакционной (хотя этот термин уже считается устаревшим). Такие связи не обновляются. Если транзакция отменена, в систему загружается обратная транзакция. Исправления задним числом не допускаются.
Примеры:
- Транзакции продаж
- Поток данных с камер видеонаблюдения (CCTV)
- Сенсорные данные от IoT-устройств
Видео или изображения, поступающие в Data Vault, не будут обновляться — они просто фиксируются как есть. Поэтому термин «транзакционная» связь заменён на неисторическая.
Рисунок 5.11 Логическая модель неисторической связи
Символ аналогичен стандартной связи, за исключением индикатора рядом с иконкой, который ясно показывает, что это неисторическая связь. По историческим причинам индикатором служит буква T, как в слове transactional link (транзакционная связь). Обратите внимание, что невозможно добавлять спутники (satellites) к неисторическим связям в логической модели (хотя существуют варианты добавления спутников в физической реализации, как мы узнаем немного позже в этом разделе). Атрибуты, являющиеся частью транзакции, добавляются непосредственно в неисторическую связь.
Существует два варианта физического моделирования неисторических связей в Data Vault. Первый вариант включает стандартную сущность связи и спутник без атрибута LoadEndDate. Таким образом, невозможно вставлять новые версии записей в этот спутник, поскольку нельзя установить дату окончания действия записи и заменить её другой версией. Рисунок 5.12 показывает электронный счёт-фактуру за авиаперелёт — типичную транзакцию в авиационной отрасли.
Рисунок 5.12 Электронный счёт-фактура за авиаперелёт
Транзакция идентифицируется номером счёта-фактуры 0198536 и была выдана 21 января 2014 года. Также указана другая информация, такая как клиент и продавец. Обратите внимание, что невозможно обновить бронирование рейса. Если информация, предоставленная во время бронирования, неверна (например, указан неправильный аэропорт назначения), единственный способ изменить бронирование — заплатить сбор за изменение и приобрести новое бронирование. Старое бронирование будет аннулировано. Поэтому обновление старого счёта-фактуры невозможно без создания нового счёта.
Логическая модель Data Vault на рисунке 5.13 фиксирует транзакцию электронного счёта-фактуры.
Рисунок 5.13 Неисторическая связь (физическая реализация)
Связь LinkInvoice фиксирует основную транзакцию с ссылкой на клиента, ссылкой на продавца и идентификатором транзакции InvoiceNumber. По определению, этот идентификатор транзакции добавляется непосредственно в неисторическую связь. Хэш-ключ неисторической связи создаётся из бизнес-ключей ссылочных хабов и идентификатора транзакции. Спутник SatInvoice содержит все описательные атрибуты, такие как Record Locator и дата выдачи счёта-фактуры (Invoice Issue Date). Обратите внимание, что дата выдачи счёта отличается от даты загрузки записи, и поэтому она должна быть добавлена в модель.
Однако возможно использовать дату транзакции в качестве даты загрузки, если момент загрузки транзакции в Data Vault совпадает с фактической датой транзакции или происходит в пределах нескольких секунд. Обратите внимание, что сущности на рисунке 5.13 не отображают все описательные атрибуты, показанные в счёте-фактуре на рисунке 5.12.
В некоторых случаях можно отказаться от использования атрибута LoadDate в записи спутника, потому что обе записи (запись связи и сопровождающая её запись спутника) будут иметь одинаковую временную метку загрузки. Таким образом, атрибут LoadDate в спутнике хранит дублирующие данные, которые занимают место на диске. Однако бывают случаи, когда данные для обеих сущностей поступают из разных источников и доставляются последовательно, с разницей в миллисекунды. Это часто происходит, например, в сценариях реального времени, которые не рассматриваются в этой книге. В любом случае, в таких случаях атрибут LoadDate должен быть смоделирован в обеих сущностях для фиксации разницы во времени поступления данных. Ещё одной причиной моделирования атрибута в обеих сущностях является стандартизация, которая упрощает понимание сущностей для новых участников проекта.
Второй вариант, которого следует избегать в большинстве случаев, — это добавление атрибутов транзакции непосредственно в структуру связи и отказ от использования структуры спутника вообще. Рисунок 5.14 показывает пример такой неисторической связи.
Рисунок 5.14 Альтернатива неисторической связи без спутника (физическая реализация)
Атрибуты InvoiceIssueDate и RecordLocator были перемещены из спутника в связь LinkInvoice. Спутник SatInvoice с рисунка 5.13 был полностью удалён, так как больше не требуется.
Этот вариант не рекомендуется, поскольку он изменяет архитектурный дизайн модели Data Vault путём внесения решений в процесс проектирования. Тем самым он увеличивает сложность модели и расходы на сопровождение. Кроме того, он усложняет автоматическую загрузку неисторических связей. Тем не менее, бывают случаи, когда второй вариант оправдан: если производительность имеет критическое значение, то есть требуется загрузка данных за миллисекунды или быстрее, может потребоваться смоделировать неисторическую связь, как показано на рисунке 5.14. Однако имейте в виду, что чрезмерная ширина таблицы связи может негативно повлиять на оптимизацию производительности. Если данные в одной строке становятся слишком широкими, это снижает количество записей на одну страницу базы данных (по крайней мере, в СУБД с построчной ориентацией, таких как Microsoft SQL Server). Физическая реализация может варьироваться в зависимости от выбранной платформы, и, как следствие, производительность загрузки и запросов к структуре связи может снижаться. Хотя это также может происходить и при использовании первого варианта, в нём можно распределить данные по нескольким спутникам, чтобы сохранить компактный размер строк.
Рисунок 5.15 показывает, что атрибуты транзакции распределены между спутниками. Оба спутника соответствуют определению неисторических спутников, изложенному в этом разделе. Перенос описательных данных из неисторической связи в зависимый спутник следует рассматривать, если количество фиксируемых атрибутов достаточно велико. Проблема в том, что Microsoft SQL Server хранит данные в файловых страницах размером 8 КБ, без возможности изменить этот параметр. Потенциальная ширина связи ограничена этим ограничением по размеру. По этой причине в структуру неисторической связи следует добавлять лишь ограниченное количество описательных полей для поддержания производительности.
Рисунок 5.15 Неисторическая связь с несколькими спутниками (физическая реализация)
Обратите внимание, что Data Vault 2.0 не зависит от используемой системы баз данных. Примеры в этой книге основаны на Microsoft SQL Server, но могут быть легко перенесены в другие системы баз данных.
Непояснённые связи (Nondescriptive Links)
Во многих случаях связи Data Vault будут иметь один или несколько спутников для предоставления контекста связи. Однако в некоторых случаях связи не будут иметь спутников. Это может происходить, если нужно указать только отношение между двумя бизнес-ключами, например, если клиент авиакомпании выразил интерес к определённому предложению, щёлкнув по рекламе на веб-сайте авиакомпании.
На рисунке 5.16 низкоценная связь Interest соединяет хабы Customer и Offering без предоставления дополнительного контекста.
Рисунок 5.16 Low-value link — Низкоценная связь (логическая модель)
Непояснённые связи также используются для хранения одного состояния в многостадийной (multistate) или ролевой (role-playing) связи. Если мы расширим предыдущий пример, мы можем создать другую связь, чтобы смоделировать другое состояние — например, что клиент был выбран для маркетинговой кампании.
Рисунок 5.17 показывает, что это второе состояние добавлено в модель через другую связь — Mailing. Обратите внимание, что существуют и другие способы моделирования многостадийных связей, например, с использованием комбинации спутника и таблицы кодов.
Рисунок 5.17 Multistate low-value link — Многостадийная низкоценная связь (логическая модель)
Вычисленные агрегатные связи (Computed Aggregate Links)
Этот тип связи Business Vault удаляет один хаб из связи и агрегирует данные по оставшимся отношениям. Например, рассмотрим модель Data Vault, показанную на рисунке 5.18.
Рисунок 5.18 Вычисленная агрегатная связь с вычисленным спутником (логическая модель)
Оригинальная связь LinkFlight соединяет три хаба: HubAirport, HubFlight и HubCarrier. Она обозначает рейс, запланированный авиаперевозчиком между двумя соединяющимися аэропортами с заданным номером рейса. Когда номер рейса удаляется из связи, новая связь LinkService теряет информацию о рейсе, потому что больше не содержит ссылки на HubFlight. Эта связь только указывает, какие перевозчики обслуживают какие аэропортовые соединения. Количество отдельных номеров рейсов агрегируется в атрибут FlightCount в спутнике SatService. И LinkService, и связанный спутник SatService не поступают из исходной системы. Вместо этого данные, хранящиеся в этих сущностях, рассчитываются на основе агрегатных функций.
Поскольку эти данные рассчитаны, а не являются «сырыми», вычисленные агрегатные связи являются частью Business Vault. Сущность не подлежит аудиту, но может быть воссоздана из исходных данных LinkFlight в любой момент времени. В этом смысле вычисленная агрегатная связь является вариантом использования таблицы-моста (bridge table).
Поскольку вычисленная агрегатная связь в этом примере является частью Business Vault, можно также изменить её структуру при необходимости, например, переместив вычисленный атрибут в структуру связи, как показано на рисунке 5.19.
Рисунок 5.19 Вычисленная агрегатная связь с вычисленным атрибутом в связи (логическая модель)
Эта опция доступна только в том случае, если вычисленная агрегатная связь является сущностью Business Vault, то есть сама связь рассчитывается из сырых данных с использованием бизнес-логики, например, оператора GROUP BY. Если данные связи вычисленной агрегатной связи поступают из исходной системы, сущность связи остаётся в Raw Data Vault (рисунок 5.20).
Рисунок 5.20 Агрегация, вычисленная на связи Raw Data Vault (логическая модель)
В этом случае агрегация, которая по-прежнему рассчитывается из других данных в исходной системе, сохраняется в вычисленных спутниках и прикрепляется к сырой связи. Такая ситуация может возникнуть, если сама связь доступна в исходной системе, но агрегация — нет. В этом случае агрегация основана на других сырых данных и прикрепляется к правильному уровню детализации, которым является LinkService в примере на рисунке 5.20. Таким образом, определяющей характеристикой обеих моделей является источник данных связи: поступают ли они из исходной системы или уже являются рассчитанными. В первом случае данные моделируются как сырая связь с прикреплённым вычисленным спутником, как на рисунке 5.20. Если связь уже рассчитана из сырых данных, например с помощью оператора GROUP BY, сущность связи становится частью Business Vault, как на рисунке 5.18.
Исследовательские связи (Exploration Links)
Исследовательские связи — это вычисленные связи, созданные исключительно по бизнес-причинам. Поэтому они являются частью Business Vault. Хотя связь между двумя хабами отсутствует в исходной системе, бизнес может принять решение создать исследовательскую связь для изучения данных (рисунок 5.21).
Рисунок 5.21 Исследовательские связи (логическая модель)
Три хаба (HubAirplane, HubEngine и HubManufacturer) на рисунке 5.21 соединены друг с другом двумя связями (LinkAirplanePart, LinkManufacturer). Бизнес может принять решение проанализировать связь между этими тремя хабами, добавив LinkAirplanePartsWithManufacturer, которая является денормализованной версией обеих связей. В других случаях бизнес может решить проанализировать связь между двумя хабами, которые соединены только косвенно — в данном случае HubAirplane и HubManufacturer. Получившаяся связь LinkAirplaneWithManufacturer предоставляет такую возможность, как показано на рисунке.
Связи, являющиеся стандартными связями Data Vault, создаются и поддерживаются вручную, хотя бизнес может принять решение автоматизировать процесс создания такой связи. Исследовательские связи являются частью Business Vault и, следовательно, не подлежат аудиту.
Причины создания исследовательских связей включают:
- Определение связей и динамических сетей между бизнес-сущностями (хабами), которых нет в исходной системе
- Представление связей, которые в противном случае были бы только косвенными
- Объединение связей между бизнес-объектами, если один из ссылаемых хабов содержит дублирующиеся записи (см. same-as link)
- Идентификация кластеров схожих записей внутри хабов (опять же, с использованием same-as links)
- Автоматическое выявление шаблонов, например при обнаружении мошенничества
Применение спутников (Satellite Applications)
После завершения обсуждения связей специального назначения, следующие разделы рассматривают аналогичные случаи для спутников Data Vault.
Перегруженные спутники (Overloaded Satellites)
Мы рекомендовали в главе 4, «Моделирование Data Vault 2.0», чтобы для каждого источника данных использовался отдельный спутник, отслеживающий атрибуты из этого источника. В некоторых случаях реализационные специалисты Data Vault пытаются объединить данные из нескольких источников в один спутник. Хотя иногда для этого есть веские причины, такой подход также несёт в себе риски.
Первая проблема возникает, если формат данных у каждого отдельного источника отличается, например, длина символов в атрибутах имени или адреса. Если данные различаются — а это весьма вероятно — данные очень быстро становятся «грязными».
Другие проблемы становятся очевидными при анализе таблицы 5.6, которая показывает извлечённые данные из перегруженного спутника.
Таблица 5.6 Перегруженный спутник с данными из нескольких источников
# | PassengerHashKey | LoadDate | LoadEndDate | Record Source | HashDiff | Name | Addr | Phone |
---|---|---|---|---|---|---|---|---|
1 | 86f8sa7b3c… | 2014-01-17 09:05:43.000 | TICKETING | 10daeb8564… | Dan Linstedt | 26 Prospect St | 802-524-8566 | |
2 | 86f8sa7b3c… | 2014-01-17 09:05:43.000 | ONLINE | 00ebf10b9e… | Daniel L | 28 Root Beer | 827-295-1212 | |
3 | 86f8sa7b3c… | 2014-01-17 09:05:43.000 | BILLING | ef843ac01e… | Dan Linste | 26 Prospect | 999-111-1111 | |
4 | 86f8sa7b3c… | 2014-01-17 09:05:43.000 | SECURITY | a7c8a5e9f1… | Dan Linstedt | 26 Prospect St | 802-555-152 | |
5 | 86f8sa7b3c… | 2014-01-17 09:05:43.000 | BAGGAGE | a723eca93f… | Dan Linstedt | 1 Richland | 802-555-1215 |
Согласно атрибуту RecordSource, данные поступают из пяти различных источников. Поскольку каждый источник имел одинаковую структуру и использовал одни и те же типы данных, бизнес решил загружать все данные в один и тот же спутник. При анализе данных возникают следующие вопросы:
- Какую из исходных систем следует считать основной, если данные противоречат друг другу (как в таблице 5.6)?
- Есть ли строки, которые замещают другие строки?
- Какая из строк является самой актуальной?
- Первичным ключом этого спутника должна быть комбинация PassengerHashKey и LoadDate. Однако эта комбинация полей в данном спутнике не уникальна. Следует ли включить атрибут RecordSource в первичный ключ, чтобы сделать его допустимым?
- Если некоторые источники данных предоставляют значения NULL или вовсе не предоставляют значения для некоторых атрибутов, как нам с ними поступать?
- Следует ли объединять или сливать данные из источников при загрузке, или оставить их как есть?
Некоторые из этих вопросов подводят нас к другой проблеме, которая заключается в обнаружении изменений (delta-detection) в спутнике. Напомним, что спутники должны хранить только изменения атрибутов, а не состояние атрибута при каждой загрузке. Однако из-за описанных выше проблем обнаружение изменений становится очень сложным (поскольку мы хотим сохранять каждое изменение из каждой исходной системы, а не только из основной системы).
Мультиактивные спутники (Multi-Active Satellites)
Мультиактивные спутники похожи на перегруженные спутники: они хранят несколько записей на один родительский ключ. Однако эти записи поступают не из разных источников, а из денормализованного источника данных, такого как COBOL copybooks или XML-файлы. Существует множество примеров допустимого использования. Например, у сотрудников может быть неограниченное количество телефонных номеров, как показано на рисунке 5.22.
Рисунок 5.22 Пример мультиактивного спутника
XML-файл слева на рисунке 5.22 представляет сотрудника с рядом телефонных номеров. Структура XML-файла преобразуется в сущность спутника Data Vault справа. Описательный атрибут (телефонный номер) — это атрибут PhoneNumber, который является единственным описательным атрибутом в этом примере. Единственное отличие от предложенной структуры в главе 4 — это PhoneSeq, номер последовательности, который представляет собой индекс, идентифицирующий телефонный номер в левой структуре. Полученные данные спутника представлены в таблице 5.7.
Таблица 5.7 Данные мультиактивного спутника
# | EmployeeHashKey | PhoneSeq | LoadDate | LoadEndDate | RecordSource | HashDiff | PhoneNumber |
---|---|---|---|---|---|---|---|
1 | 33aa… | 1 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 12fb… | 1-405-1234123 |
2 | 33aa… | 2 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 76ca… | 1-213-1561234 |
3 | 33aa… | 3 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 8cb1… | 49-511-55349873 |
4 | 33aa… | 4 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 9944… | 49-30-12345678 |
Данные показывают, что существует одна запись на каждый номер телефона из XML-источника. Каждая запись идентифицируется по
- EmployeeHashKey — хеш-ключу родительского элемента спутника;
- PhoneSeq — позиции телефонного номера в XML-файле;
- и LoadDate — метке времени первого появления данных в исходном файле.
Тем не менее, с мультиактивными спутниками связаны определённые проблемы, поскольку существует зависимость от порядка детализированных записей. Если порядок номеров телефонов в XML-файле изменится, все данные по сотруднику будут восприниматься как дельта, даже если просто два номера поменялись местами без изменения самих номеров. Таблица 5.8 показывает пример таких данных.
Таблица 5.8 Данные мультиактивного спутника с изменённым порядком в источнике
# | EmployeeHashKey | PhoneSeq | LoadDate | LoadEndDate | RecordSource | HashDiff | PhoneNumber |
---|---|---|---|---|---|---|---|
1 | 33aa… | 1 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 12fb… | 1-405-1234123 |
2 | 33aa… | 2 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 76ca… | 1-213-4561234 |
3 | 33aa… | 3 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 8cb1… | 49-511-55349873 |
4 | 33aa… | 4 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 9944… | 49-30-12345678 |
5 | 8321… | 1 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 93ca… | 1-205-1234123 |
6 | 8321… | 2 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 328a… | 49-40-12345678 |
7 | 33aa… | 1 | 2013-07-20 02:54:05 | (Null) | Employee.xml | 12fb… | 1-405-1234123 |
8 | 33aa… | 2 | 2013-07-20 02:54:05 | (Null) | Employee.xml | 8cb1… | 49-511-55349873 |
9 | 33aa… | 3 | 2013-07-20 02:54:05 | (Null) | Employee.xml | 76ca… | 1-213-4561234 |
10 | 33aa… | 4 | 2013-07-20 02:54:05 | (Null) | Employee.xml | 9944… | 49-30-12345678 |
Первые четыре записи (записи №1–4) представляют первый порядок в исходной системе, в то время как последние четыре записи (записи №7–10) представляют порядок тех же, неизменённых записей при второй загрузке пакета. Однако старые записи из первого пакета помечены как удалённые по значению LoadEndDate, которое в этих случаях не равно null (напомним, это означает, что они были заменены).
Для решения этой проблемы можно использовать сам номер телефона в качестве номера последовательности. Субпоследовательность, как в таблице 5.7, должна использоваться только как архитектурный резервный вариант и только с активным сжатием таблицы. Таблица 5.9 приводит пример. Это устраняет зависимость от порядка при проверке дельт, но исключает возможность воссоздать набор данных в правильном порядке поступления. Если это важно, субпоследовательность, как показано в предыдущем примере — единственный способ. Другой вариант — перед вставкой включать существование телефонного номера в спутнике как текущей активной строки. Однако этот вариант не проверяет удалённые номера, которые могли исчезнуть из входящего набора данных.
Таблица 5.9 Данные мультиактивного спутника с альтернативным атрибутом последовательности
# | EmployeeHashKey | PhoneSeq | LoadDate | LoadEndDate | RecordSource | HashDiff | PhoneNumber |
---|---|---|---|---|---|---|---|
1 | 33aa… | 1-405-1234123 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 12fb… | 1-405-1234123 |
2 | 33aa… | 1-213-4561234 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 76ca… | 1-213-4561234 |
3 | 33aa… | 49-511-55349873 | 2013-07-14 03:10:15 | 2013-07-20 02:54:04 | Employee.xml | 8cb1… | 49-511-55349873 |
4 | 33aa… | 49-30-12345678 | 2013-07-14 03:10:15 | (Null) | Employee.xml | 9944… | 49-30-12345678 |
5 | 33aa… | 1-213-4561235 | 2013-07-20 02:54:05 | (Null) | Employee.xml | 776a… | 1-213-4561235 |
Таблица показывает, что запись №2 была обновлена записью №5 во втором пакете. Запись №3 была удалена и больше не существует. Поэтому она получила конечную дату (end-dated) в спутнике. Обратите внимание, что описательный атрибут PhoneNumber дублируется в первичном ключе спутника (атрибут PhoneSeq), а не просто перемещается. Это упрощает понимание спутника для следующего пользователя, которому необходимо извлекать описательные атрибуты из спутника для бизнеса.
Если используется описанное решение, могут возникнуть две проблемы: во-первых, альтернативный атрибут должен быть NOT NULL и уникальным в контексте родителя, и во-вторых, производительность может значительно пострадать. Проблема с производительностью возникает, если альтернативный столбец последовательности является строкой, а не числом. Однако последовательность, составленная из символов, является лучшим решением из двух плохих (наилучший вариант из худших).
Спутники отслеживания статусов (Status Tracking Satellites)
Спутники отслеживания статусов используются для загрузки журналов аудита или данных из систем фиксации изменений (Change Data Capture, CDC). Эти методы отслеживают информацию об операциях CRUD (также SCRUD) в исходной системе. Информация должна предоставляться исходной системой и включает сведения о создании (C), чтении (R), обновлении (U), удалении (D) и поиске (S) данных в исходной системе. Часто эта информация сохраняется операционной системой каждый раз, когда пользователь выполняет одну из этих операций в приложении. Таблица 5.10 предоставляет пример такой SCRUD-таблицы. Это результат функции CDC и показывает все изменения в исходной таблице.
Таблица 5.10 Таблица фиксации изменений (CDC) для сотрудников
# | __$start_lsn | __$seqval | __$operation | __$update_mask | Employee ID | First Name | Last Name |
---|---|---|---|---|---|---|---|
1 | 0x0000001C00000610004 | 0x0000001C00000610002 | 1 | 0x07 | 5 | Chris | Miller |
2 | 0x0000001C00000620004 | 0x0000001C00000620003 | 2 | 0x07 | 3 | Jane | Brown |
3 | 0x0000001C000006D0004 | 0x0000001C000006D0002 | 4 | 0x02 | 1 | Mike | Freeman |
4 | 0x0000001C000006E0004 | 0x0000001C000006E0002 | 4 | 0x02 | 1 | Michael | Freeman |
В этом случае источник записи указывается в атрибуте RecordSource, а появление отслеживаемого бизнес-ключа или связи фиксируется в Appearance. Такая структура не требует изменений в структуре таблицы для добавления новых источников записей, поскольку новый источник требует только вставки данных в спутник отслеживания записей. Однако анализ данных спутника становится более сложным, но может быть выполнен с помощью оператора PIVOT в SQL, который доступен в Microsoft SQL Server и других СУБД.
Если бизнес предоставляет детализированные источники записей (чего мы стараемся придерживаться в этой книге как можно чаще), также возможно отслеживать перемещения данных внутри системы-источника: где впервые появился бизнес-ключ или связь в системе, куда он переместился и т.д. Детализированный источник записи максимально точно указывает источник. Например, источник записи «CRM/Contact/Lead» указывает на сущность Lead в области Contact в Microsoft CRM. Сравните эту подразумеваемую информацию с недетализированным источником записи «CRM», где не указана никакая конкретная информация о происхождении данных. Чтобы извлечь максимум пользы из источника записи и тем самым предоставить как можно больше ценности для бизнеса, старайтесь использовать максимально детализированные источники записей.
Также рекомендуется использовать иерархическую систему, чтобы агрегировать данные на отдельных уровнях для анализа.
Вычисляемые спутники (Computed Satellites)
Согласно определению Data Vault хранит необработанные (сырые) данные. Однако в некоторых случаях может быть полезно хранить вычисленные данные.
В модели Data Vault для этого предусмотрено место — Business Vault. В разделе 2.2 главы 2 мы представили Business Vault как набор таблиц, следующих модели Data Vault и содержащих данные, изменённые согласно бизнес-правилам. Эти таблицы называются вычисляемыми спутниками и предназначены для хранения вычисленных данных — то есть данных, являющихся результатом агрегации, суммирования, корректировки, оценки и т.п. Это может быть результат процедур проверки качества данных, очистки данных или корректировки адресов.
Обычно бизнес хочет выполнять такие операции только один раз перед распространением в информационные витрины (information marts), чтобы сэкономить вычислительные ресурсы. Вычисляемый спутник предназначен именно для этой цели: он хранит данные до их распространения. При этом структура вычисляемого спутника такая же, как у стандартного спутника. Единственное отличие — источник записи указывает, что данные сгенерированы системой. Также можно указать функцию, операцию или приложение, выполняющее вычисления для спутника, особенно если существует несколько источников данных, загружающих один и тот же вычисляемый спутник.
Поскольку для вычисленных данных нет прямого сырого источника, они по своей природе не подлежат аудиту. Однако возможно, что аудитор захочет изучить логику вычислений или, по крайней мере, увидеть, как, когда и что представляли собой данные до передачи их в информационные витрины. Вычисляемый спутник — это место, где можно это показать.
Логический символ вычисляемых спутников представлен на рисунке 5.27.
Рисунок 5.27 Вычисляемый спутник (логический символ)
Кроме значка на фигуре, отличий от стандартных спутников нет. Как уже упоминалось, структура такая же. Снова, различие заключается в источнике данных, поскольку в этом типе сущности хранятся вычисленные данные.
Leave a Reply