<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Raw Data Vault - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<atom:link href="https://datatalks.ru/tag/raw-data-vault/feed/" rel="self" type="application/rss+xml" />
	<link>https://datatalks.ru/tag/raw-data-vault/</link>
	<description>RoadMap для инженера данных. Дорожная карта по инструментам Data Engineer</description>
	<lastBuildDate>Tue, 19 Aug 2025 19:08:30 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://datatalks.ru/wp-content/uploads/2024/12/cropped-logo_datatalks-32x32.png</url>
	<title>Raw Data Vault - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<link>https://datatalks.ru/tag/raw-data-vault/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Перевод 5 Главы &#8212; Intermediate Моделирование Data Vault</title>
		<link>https://datatalks.ru/data-vault-chapter-5-intermediate-data-vault-modeling/</link>
					<comments>https://datatalks.ru/data-vault-chapter-5-intermediate-data-vault-modeling/#respond</comments>
		
		<dc:creator><![CDATA[Data Engineer (Admin)]]></dc:creator>
		<pubDate>Sat, 28 Jun 2025 09:28:13 +0000</pubDate>
				<category><![CDATA[Data Vault 2.0]]></category>
		<category><![CDATA[Business Vault]]></category>
		<category><![CDATA[Computed Satellites]]></category>
		<category><![CDATA[Effectivity Satellites]]></category>
		<category><![CDATA[HUB]]></category>
		<category><![CDATA[LINK]]></category>
		<category><![CDATA[link-to-link]]></category>
		<category><![CDATA[Multi-Active Satellites]]></category>
		<category><![CDATA[Overloaded Satellites]]></category>
		<category><![CDATA[Raw Data Vault]]></category>
		<category><![CDATA[Record Tracking Satellites]]></category>
		<category><![CDATA[SAL same-as links]]></category>
		<category><![CDATA[SAT]]></category>
		<category><![CDATA[Status-Tracking Satellites]]></category>
		<guid isPermaLink="false">https://datatalks.ru/?p=1113</guid>

					<description><![CDATA[<p>Перевод книги &#171;Building a Scalable Data Warehouse with Data Vault 2.0&#187; подготовлен автором сайта ГЛАВА 5 – Intermediate Моделирование Data Vault Вспомним про структуру Data Vault и ключевые термины Этот раздел не является частью книги, он содержит краткую выдержку по структуре Data Vault (для того, чтобы освежить в памяти структуру DV и основные термины). Структура [&#8230;]</p>
<p>Сообщение <a href="https://datatalks.ru/data-vault-chapter-5-intermediate-data-vault-modeling/">Перевод 5 Главы &#8212; Intermediate Моделирование Data Vault</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Перевод книги &#171;Building a Scalable Data Warehouse with Data Vault 2.0&#187; подготовлен автором сайта</em></p>
<h1><strong>ГЛАВА 5 – Intermediate Моделирование Data Vault</strong></h1>
<h2>Вспомним про структуру Data Vault и ключевые термины</h2>
<p>Этот раздел не является частью книги, он содержит краткую выдержку по структуре Data Vault (для того, чтобы освежить в памяти структуру DV и основные термины).</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology.jpeg"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1579" src="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology.jpeg" alt="" width="1114" height="707" srcset="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology.jpeg 1114w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology-300x190.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology-1024x650.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology-768x487.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology-450x286.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_terminology-780x495.jpeg 780w" sizes="(max-width: 1114px) 100vw, 1114px" /></a></p>
<p><strong>Структура Data Vault</strong></p>
<ul>
<li><strong>Raw Data Vault </strong>&#8212; это сырой слой данных, где хранятся исходные данные:
<ul>
<li><strong>HUB</strong> — таблица, содержащая связку бизнес-ключа сущности и суррогатного ключа хранилища</li>
<li><strong>LINK</strong> &#8212; таблица связей сущностей по суррогатным ключам</li>
<li><strong>SAT</strong> &#8212; таблица атрибутов сущности</li>
</ul>
</li>
<li><strong>Business Vault </strong>&#8212; содержит бизнес-правила и преобразования, применяемые к исходным данным:
<ul>
<li><strong>SAL</strong> &#8212; таблицы унификации ключей сущности</li>
<li><strong>PIT</strong> &#8212; таблица расчета полной истории сущности (опционально)</li>
<li><strong>Bridge/Calculation tables</strong> &#8212; таблицы с любыми видами расчетов</li>
</ul>
</li>
<li><strong>Information Mart / Data Mart</strong> — это аналитический слой данных. Он предназначен для построения отчётов и визуализации данных для пользователей.</li>
<li><strong>Генерация ключей</strong>
<ul>
<li><strong>Sequence</strong> &#8212; надежно и синхронно</li>
<li><strong>Hash</strong> &#8212; коллизии и ассинхрон (шанс коллизии у md5 50% на 2^64 записей). Используем hash, если у вас нет явных требований на 100% точность в DWH. А если они есть, переубеждаем тех, кто их поставил.</li>
</ul>
</li>
</ul>
<p><strong>Пример связей между таблицами:</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model.jpeg"><img decoding="async" class="aligncenter size-full wp-image-1584" src="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model.jpeg" alt="" width="1027" height="512" srcset="https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model.jpeg 1027w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model-300x150.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model-1024x511.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model-768x383.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model-450x224.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/data_vault_model-780x389.jpeg 780w" sizes="(max-width: 1027px) 100vw, 1027px" /></a></p>
<hr />
<p>Презентация с конференции <strong><a href="https://datatalks.ru/wp-content/uploads/2025/06/SmartData2024_data_vault.pdf" target="_blank" rel="noopener">SmartData 2024 Data Vault</a></strong>.</p>
<hr />
<p><strong>Переводы 1-4 глав книги по Data Vault 2.0:</strong></p>
<ul>
<li><a href="https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/" target="_blank" rel="noopener">Перевод 1 Главы — Введение в хранилища данных</a></li>
<li><a href="https://datatalks.ru/data-vault-2-0-chapter-2-scalable-data-warehouse-architecture/" target="_blank" rel="noopener">Перевод 2 Главы — Масштабируемая архитектура хранилища данных</a></li>
<li><a href="https://datatalks.ru/chapter-3-data-vault-2-0-methodology/" target="_blank" rel="noopener">Перевод 3 Главы — Методология Data Vault 2.0</a></li>
<li><a href="https://datatalks.ru/chapter-4-data-vault-2-0-modeling/" target="_blank" rel="noopener">Перевод 4 Главы — Моделирование Data Vault 2.0 — Что такое Hub / Link / Satellite?</a></li>
</ul>
<hr />
<h2>Аннотация к главе 5</h2>
<p>В этой главе рассматриваются более сложные сущности Data Vault. Они расширяют базовые сущности. Здесь будут затронуты различные специальные типы спутников (Satellite), включая:</p>
<ul>
<li>перегруженные спутники (<strong>Overloaded Satellites</strong>),</li>
<li>мультиактивные спутники (<strong>Multi-Active Satellites</strong>),</li>
<li>спутники отслеживания статуса (<strong>Status-Tracking Satellites</strong>),</li>
<li>спутники актуальности (<strong>Effectivity Satellites</strong>),</li>
<li>спутники отслеживания записей (<strong>Record Tracking Satellites</strong>) и</li>
<li>вычисляемые спутники (<strong>Computed Satellites</strong>).</li>
</ul>
<p>Также рассматриваются расширенные сущности связей, включая <strong>связи между связями (link-to-link)</strong>, <strong>связи «same-as» (same-as links)</strong>, <strong>иерархические связи</strong>, <strong>неисторические связи (nonhistorized links)</strong>, недескриптивные связи, вычисляемые агрегатные связи и исследовательские связи.</p>
<p>Для каждой сущности связи будет объяснена техническая или бизнес-причина её добавления в Data Vault.</p>
<p><strong>Ключевые слова:</strong></p>
<ul>
<li>хранилище данных</li>
<li>data vault</li>
<li>спутники</li>
<li>сущности связей</li>
<li>моделирование данных</li>
</ul>
<p>Типы сущностей, представленные в предыдущей главе, являются основой для других сущностей Data Vault, представленных в этой главе. Многие из этих примеров — это просто применения существующих сущностей связи или спутников без изменения структуры самой сущности. Они часто используются в Business Vault.</p>
<h1>Применение хабов</h1>
<p>Глава 4, Моделирование Data Vault 2.0, представила <span style="color: #ff6600;"><strong>хабы Data Vault</strong></span> как центральные сущности, используемые для хранения бизнес-ключей, идентифицирующих бизнес-объекты. В теории в предприятии должна быть одна ведущая операционная система, отслеживающая конкретный бизнес-объект.</p>
<p><strong>Системы управления взаимоотношениями с клиентами (CRM)</strong> являются хорошими примерами таких операционных систем, которые являются основным источником всей информации, связанной с клиентами. Однако на практике бизнес-объекты, такие как клиенты, хранятся в нескольких операционных системах, например, в ритейл-базах данных, e-commerce приложениях, системах управления счетами и так далее. Предприятия пытаются консолидировать эту информацию с помощью концепции, называемой управлением мастер-данными (master data management).</p>
<p>На Рисунке 5.1 показано, что все данные, включая бизнес-ключи, сначала загружаются в слой Data Vault через <strong>staging-область</strong>. Консолидация происходит при обработке сложных бизнес-правил и построении <strong>витрин данных (information marts)</strong>. Специалисты по хранилищам данных сталкиваются с множественными источниками для одного и того же бизнес-объекта.</p>
<p>Основная проблема при наличии нескольких источников заключается в том, что каждый из них имеет различные возможности по определению бизнес-объекта. Это связано с тем, что в момент создания этих систем в прошлом бизнес выдвигал к ним разные требования. В результате даже типы данных бизнес-ключей могут отличаться: в некоторых случаях буквенно-цифровой номер клиента (например, US4317 для клиента из США), определённый на уровне предприятия, не может быть использован в другой операционной системе, поскольку она не допускает буквенные символы в номере клиента. В таком случае бизнес будет полагаться на какие-либо маппинговые таблицы, которые отображают клиента US4317 из CRM-системы в клиента 132842 в e-commerce приложении.</p>
<p><strong>Рисунок 5.1 Консолидация различных источников в хранилище данных</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution.jpeg"><img decoding="async" class="aligncenter size-full wp-image-1571" src="https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution.jpeg" alt="" width="1156" height="648" srcset="https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution.jpeg 1156w, https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution-300x168.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution-1024x574.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution-768x431.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution-450x252.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/01_data_valult_enterprise_bi_solution-780x437.jpeg 780w" sizes="(max-width: 1156px) 100vw, 1156px" /></a></p>
<p>Поскольку такая ситуация встречается чаще всего, в Data Vault предусмотрено решение. Рекомендуемая практика — загружать все бизнес-ключи, независимо от их конкретного формата, в один общий хаб (в данном случае — хаб клиентов) и создавать специальную связь, называемую <strong>same-as link (SAL)</strong>, чтобы указать бизнес-ключи, которые идентифицируют один и тот же бизнес-объект.</p>
<h2>Консолидация бизнес-ключей</h2>
<p><strong>Business Vault</strong> представляет собой расширение <strong>Data Vault RAW</strong> и позволяет разработчикам хранилищ данных добавлять вычисляемые данные в слой Data Vault. В этой главе будут представлены <strong>вычисляемые агрегатные связи (computed aggregate links), исследовательские связи (exploration links) и вычисляемые спутники (computed satellites)</strong> в качестве примеров типов сущностей, входящих в состав Business Vault. Эти типы сущностей моделируются аналогично основным сущностям Data Vault, следуя концепциям моделирования Data Vault, особенно для связей и спутников.</p>
<p>Тем не менее, каждую стандартную сущность Data Vault можно кастомизировать в соответствии с потребностями организации. Эти модификации, которые становятся частью Business Vault, получают данные из стандартных сущностей <strong>сырого (RAW) Data Vault</strong> (хабы, связи и спутники) и часто оптимизируются для повышения производительности при выполнении запросов к данным в Data Vault.</p>
<p>Распространённый вариант использования — консолидация бизнес-ключей из различных источников, как показано в Таблицах 5.1 и 5.2 и на Рисунке 5.2.</p>
<p><strong>Таблица 5.1 Хаб «Пассажир»</strong></p>
<table>
<thead>
<tr>
<th><strong>Passenger HashKey</strong></th>
<th><strong>Load Date</strong></th>
<th><strong>Record Source</strong></th>
<th><strong>Passenger Number</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>8473d2a…</td>
<td>2014-06-26</td>
<td>DomesticFlight</td>
<td>1234</td>
</tr>
<tr>
<td>9d8e72a…</td>
<td>2014-06-26</td>
<td>DomesticFlight</td>
<td>1257</td>
</tr>
<tr>
<td>1a4e2c2…</td>
<td>2014-06-26</td>
<td>InternationalFlight</td>
<td>C21X9</td>
</tr>
<tr>
<td>238aaff…</td>
<td>2014-06-26</td>
<td>InternationalFlight</td>
<td>C43Z8</td>
</tr>
</tbody>
</table>
<p><strong>Таблица 5.2 Same-as-Link для пассажира</strong></p>
<table>
<thead>
<tr>
<th><strong>SALPassenger HashKey</strong></th>
<th><strong>Load Date</strong></th>
<th><strong>Record Source</strong></th>
<th><strong>Master Passenger HashKey</strong></th>
<th><strong>Duplicate Passenger HashKey</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>38dfa8…</td>
<td>2014-06-26</td>
<td>Dedupe</td>
<td>238aaff…</td>
<td>8473d2a…</td>
</tr>
<tr>
<td>937aae…</td>
<td>2014-06-26</td>
<td>Dedupe</td>
<td>1a4e2c2…</td>
<td>9d8e72a…</td>
</tr>
</tbody>
</table>
<p><strong>Рисунок 5.2 Хаб со структурой Same-as-Link (SAL) для устранения дубликатов бизнес-ключей пассажиров</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1602" src="https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure.jpeg" alt="" width="958" height="520" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure.jpeg 958w, https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure-300x163.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure-768x417.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure-450x244.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_2_data_vault_same_as_link_SAL_structure-780x423.jpeg 780w" sizes="(max-width: 958px) 100vw, 958px" /></a></p>
<p>В данном случае в <strong>сыром Data Vault</strong> существует <strong>хаб (hub) Passenger</strong>, получаемый из нескольких исходных таблиц, содержащих номера пассажиров. Во многих организациях используются исходные системы, которые не интегрированы между собой. В результате один и тот же пассажир может присутствовать в нескольких операционных системах с разными идентификаторами (например, номер водительского удостоверения или номер паспорта). Ещё одной причиной данной проблемы является поддержка различными системами разных форматов для одного и того же бизнес-ключа.</p>
<p>В этом примере исходная система Domestic Flight допускает (и использует) только числовые номера водительских удостоверений, в то время как система International Flight допускает буквенно-цифровые бизнес-ключи. Такая ситуация далека от идеальной, но часто возникает, когда две организации объединяются и продолжают использовать свои старые системы без должной интеграции.</p>
<p>Проблема решается <strong>путём добавления к хабу структуры <span style="color: #ff6600;">Same-as-Link (SAL)</span></strong>, которая указывает, какие номера клиентов соответствуют одному и тому же клиенту. Существует несколько способов вычислить записи для Same-as-Link, и они могут быть результатом <strong><span style="color: #ff6600;">алгоритмов дедупликации</span> клиентов</strong>, как в данном примере. Соответствующая диаграмма «сущность-связь» (ER-диаграмма) представлена на Рисунке 5.3.</p>
<p><strong>Рисунок 5.3 ER-диаграмма структуры Same-as-Link для устранения дубликатов бизнес-ключей пассажиров (физическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1603" src="https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL.jpeg" alt="" width="1156" height="579" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL.jpeg 1156w, https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL-300x150.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL-1024x513.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL-768x385.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL-450x225.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_3_data_vault_er_diagram_same_as_link_SAL-780x391.jpeg 780w" sizes="(max-width: 1156px) 100vw, 1156px" /></a></p>
<p>Этот подход, основанный на Same-as-Link и хабе с единственным бизнес-ключом, работает только в том случае, если диапазоны значений ключей в обеих системах не пересекаются. Если же они пересекаются, один и тот же бизнес-ключ может идентифицировать разные бизнес-объекты в разных системах. Вместо того чтобы использовать один хаб для всех бизнес-ключей из всех исходных систем в сыром Data Vault, существует два варианта решения этой ситуации.</p>
<p><strong>Во-первых,</strong> можно расширить хаб, добавив ещё один бизнес-ключ, идентифицирующий систему-источник. Этот искусственный ключ становится частью составного бизнес-ключа хаба. Недостатком этого решения является то, что оно не приводит к интеграции исходных систем.</p>
<p><strong>Другой вариант</strong> — создать несколько хабов и связать их между собой с помощью таблицы связей (link). Это решение документирует различное использование бизнес-ключей в модели, но требует создания большего числа сущностей в сыром Data Vault.</p>
<p>С точки зрения моделирования оба решения далеки от идеала, но они отражают реальное использование бизнес-ключей в системах-источниках и бизнес-практиках. Однако в обоих случаях это правильный подход, поскольку моделирование в Data Vault 2.0 ориентировано на бизнес. Если организация использует неидеальные методы ведения бизнеса, это также должно быть отражено в модели Data Vault.</p>
<p>Когда данные трансформируются в Business Vault, всё ещё возможно объединить бизнес-ключи в одном бизнес-хабе, включая структуру Same-as-Link, как показано на Рисунке 5.3. На самом деле, Same-as-Link является сущностью Business Vault, при условии, что информация не извлекается напрямую из системы-источника, а поддерживается вручную или с помощью алгоритмов. Однако если бизнес-ключи объединяются в бизнес-хаб, они не должны пересекаться и должны идентифицировать только один бизнес-объект. Это соответствует стандарту Data Vault 2.0 и может быть достигнуто с помощью префиксов или постфиксов (или форматирующих элементов) для бизнес-ключей, которые не поступают из ведущей системы-источника.</p>
<p>Например, если ведущей системой является CRM-приложение и оно не предоставляет бизнес-ключ для конкретного бизнес-объекта, идентифицирующий бизнес-ключ берётся из вторичной системы-источника и загружается в бизнес-хаб. Примером такой вторичной системы может быть система тикетов (ticketing), где клиент был добавлен, но никогда не синхронизировался и не реплицировался в CRM-приложение. Чтобы указать на этот неидеальный случай и избежать путаницы, бизнес-ключ из ticketing-системы заключают в скобки, например, <strong>“(4711)”</strong>. Этот бизнес-ключ затем используется в аналитических отчётах, и бизнес-пользователю становится очевидно, что ключ не из CRM-системы и его там не найти. Также возможно добавлять к ключу имя системы-источника, например, <strong>“(TCK:4711)”</strong>, чтобы пользователь знал, откуда поступил данный ключ.</p>
<p>Запросы к таким двум таблицам в некоторых случаях могут быть довольно сложными. Кроме того, в большинстве случаев бизнесу требуется консолидированный вид клиентских номеров, а не сырые данные — за исключением случаев анализа качества данных. Поэтому целесообразно предоставить консолидированный список, получаемый в результате сложного запроса, в виде нового материализованного хаба. Этот хаб имеет ту же структуру, что и хаб в сыром Data Vault, но содержит другие данные. Таким образом, утверждение из начала этого раздела остаётся верным: в Business Vault нет специальной сущности типа «хаб». Однако логично создавать хабы Business Vault, чтобы предоставлять разные наборы бизнес-ключей и улучшать последующую выборку данных. В этом случае атрибут <strong>record source</strong> изменяется на <strong>“SYSTEM”</strong> или <strong>“SYS”</strong>, чтобы указать, что значение было сгенерировано системой хранилища данных.</p>
<p>Этот пример является типичным случаем, когда бизнес-правила применяются в Business Vault. Хотя бизнес-правила обычно реализуются при загрузке витрин данных, хорошей практикой является их реализация в Business Vault, если они используются более чем в 80% отчётов или если их выполнение требует значительных ресурсов. В данном случае <strong>«heavy lifting»</strong> означает долгие по времени или сложные бизнес-правила. Таким образом можно избежать повторной реализации бизнес-правил для каждой витрины данных. Это становится особенно важным в случае сложных и ресурсоёмких правил, которые используются в нескольких витринах.</p>
<p>Глава 6, Продвинутое моделирование Data Vault, <strong>рассматривает ещё две сущности Business Vault (таблицу PIT и таблицу bridge), которые используются для упрощения запросов к данным из сырого Data Vault и повышения производительности запросов.</strong> По этой причине они также называются <strong>query assistant tables</strong> (вспомогательные таблицы для запросов).</p>
<h1>Применение связей (Link Applications)</h1>
<p>В следующих разделах представлены распространённые структуры связей и сценарии их применения, которые специалисты по Data Vault часто используют в своих проектах.</p>
<h2>Link-on-link</h2>
<p>Один из часто задаваемых вопросов на этапе проектирования Data Vault — возможно ли создание связей, которые ссылаются на другие связи (так называемые структуры <strong>link-on-link</strong>).<br />Рассмотрим пример отклонения рейса в авиационной отрасли. Вместо того чтобы прибыть в исходный аэропорт, рейс перенаправляется из-за неблагоприятных погодных условий или инцидента, связанного с безопасностью. Первая идея по моделированию этой ситуации в Data Vault представлена на логической схеме на рисунке 5.4.</p>
<p><strong>Рисунок 5.4 Логическая модель Data Vault с link-on-link структурой</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1604" src="https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design.jpeg" alt="" width="962" height="385" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design.jpeg 962w, https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design-300x120.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design-768x307.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design-450x180.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_4_data_vault_Link_on_link_Data_Vault_model_logical_design-780x312.jpeg 780w" sizes="(max-width: 962px) 100vw, 962px" /></a></p>
<p>Связь в центре модели <strong>LinkFlight</strong> представляет собой исходную информацию о рейсе, запланированную авиаперевозчиком. Каждый рейс имеет исходный и конечный аэропорт (поэтому <strong>LinkFlight</strong> связан дважды с <strong>HubAirport</strong>), а также ссылку на номер рейса и номер борта. Обратите внимание, что на схеме не показаны спутники.</p>
<p>Отклонение рейса моделируется как ещё одна связь — <strong>LinkDiversionFlight</strong>. Она ссылается на исходный рейс в <strong>LinkFlight</strong> и добавляет ссылку на новый аэропорт прибытия. Хотя эта модель выглядит достаточно эффективной, она вводит нежелательную зависимость между двумя связями. Такая зависимость плохо масштабируется и не обеспечивает должной производительности в условиях высоких объёмов и скоростей обработки данных (big data).</p>
<p>Чем больше подобных <strong>link-to-link</strong> структур необходимо обработать на уровне СУБД, тем более экспоненциальным становится объём работы для неё. Для обеспечения гибкости и масштабируемости с большими объёмами данных модель необходимо перепроектировать на раннем этапе.</p>
<p><strong>Функциональность, необходимая бизнес-пользователю, поставляется итеративно в рамках отдельных спринтов.</strong> Цель — поставлять небольшие инкременты хранилища данных и внедрять эти изменения в продакшн по завершении каждого спринта. Проблема с <strong>link-to-link</strong> структурами в том, что изменение родительской связи (в данном случае <strong>LinkFlight</strong>) требует изменения всех зависимых дочерних связей (например, <strong>LinkDiversionFlight</strong>).</p>
<p>Такие каскадные изменения увеличивают время, необходимое на модификацию компонентов хранилища данных по запросу на изменение, и могут не позволить завершить внедрение запроса в рамках одного спринта. Следовательно, подобные связи следует избегать для сохранения гибкости команды ИТ. Рекомендуемая практика — отказаться от ссылок между связями и реализовать связи независимо (см. рисунок 5.5); в кругах моделирования данных это известно как <strong>денормализация</strong>.</p>
<p><strong>Рисунок 5.5 Логическая модель с независимыми связями</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1606" src="https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design.jpeg" alt="" width="957" height="494" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design.jpeg 957w, https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design-300x155.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design-768x396.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design-450x232.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_5_data_vault_independent_links_logical_design-780x403.jpeg 780w" sizes="(max-width: 957px) 100vw, 957px" /></a></p>
<p>Теперь каждая связь является независимой и может изменяться отдельно в случае необходимости изменений в её структуре в будущем.</p>
<h2>Same-as Links (SAL)</h2>
<p><strong>Same-as-Link</strong> используются для указания на дублирующиеся бизнес-ключи внутри сущности хаба в Data Vault. Это необходимо в случаях, когда один и тот же бизнес-объект идентифицируется несколькими бизнес-ключами.</p>
<p>Например, в таблице 5.3 представлен фрагмент списка клиентов, загруженного из различных источников.</p>
<p><strong>Таблица 5.3 Хаб клиентов (Customer Hub)</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th><strong>CustomerHashKey</strong></th>
<th><strong>LoadDate</strong></th>
<th><strong>RecordSource</strong></th>
<th><strong>CustomerNo</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>b7b0a554b9…</td>
<td>2014-01-17 08:20:15.000</td>
<td>CRM</td>
<td>DE4711</td>
</tr>
<tr>
<td>2</td>
<td>dd2c1f2d8d…</td>
<td>2014-01-17 08:20:15.000</td>
<td>CRM</td>
<td>US4317</td>
</tr>
<tr>
<td>3</td>
<td>e138c1d3c9c…</td>
<td>2014-01-17 08:20:15.000</td>
<td>CRM</td>
<td>UK8876</td>
</tr>
<tr>
<td>4</td>
<td>d1360901d7…</td>
<td>2014-01-17 09:05:43.000</td>
<td>SHOP</td>
<td>764912</td>
</tr>
<tr>
<td>5</td>
<td>74b3a3c01…</td>
<td>2014-01-17 09:05:43.000</td>
<td>SHOP</td>
<td>124784</td>
</tr>
<tr>
<td>6</td>
<td>a11593aea…</td>
<td>2014-01-17 09:05:43.000</td>
<td>SHOP</td>
<td>132842</td>
</tr>
</tbody>
</table>
<p><strong>Хаб</strong> был загружен из нескольких источников, использующих разные форматы хранения номера клиента. В то время как CRM-система хранит клиентские номера как <strong>составной ключ (так называемый <span style="color: #ff6600;">“smart-key”</span>)</strong>, интернет-магазин способен хранить только числовые значения для клиентских номеров. Поэтому бизнес предоставляет таблицу сопоставления между номерами клиентов в CRM-системе и системе интернет-магазина (таблица 5.4).</p>
<p><strong>Таблица 5.4 Сопоставление клиентских номеров между системами-источниками</strong></p>
<table>
<thead>
<tr>
<th>CRM Customer Number</th>
<th>SHOP Customer Number</th>
</tr>
</thead>
<tbody>
<tr>
<td>DE4711</td>
<td>124784</td>
</tr>
<tr>
<td>US4317</td>
<td>132842</td>
</tr>
<tr>
<td>UK8876</td>
<td>764912</td>
</tr>
</tbody>
</table>
<p>Имея таблицу соответствия клиентских номеров, можно создать структуру связи, изображённую на рисунке 5.6.</p>
<p><strong>Рисунок 5.6 Физическая модель Same-as-Link для клиентов</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1608" src="https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design.jpeg" alt="" width="795" height="435" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design.jpeg 795w, https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design-300x164.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design-768x420.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design-450x246.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_6_data_vault_Same_as_Link_SAL_physical_design-780x427.jpeg 780w" sizes="(max-width: 795px) 100vw, 795px" /></a></p>
<p>Эта связь заполняется записями, подобными тем, что представлены в таблице 5.5.</p>
<p><strong>Таблица 5.5 Same-as-Link для клиентских номеров</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>SAICustomerHashKey</th>
<th>LoadDate</th>
<th>RecordSource</th>
<th>CustomerMasterHashKey</th>
<th>CustomerDuplicateHashKey</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>c5cd634e4a… {DE4711;124784}</td>
<td>2014-01-17 09:08:27.000</td>
<td>MDM</td>
<td>b7b0a554b9… {DE4711}</td>
<td>74f33a3c01… {124784}</td>
</tr>
<tr>
<td>2</td>
<td>69777c1b5b… {US4317;132842}</td>
<td>2014-01-17 09:08:27.000</td>
<td>MDM</td>
<td>dd2c1f2d8d… {US4317}</td>
<td>a11593aeaa… {132842}</td>
</tr>
<tr>
<td>3</td>
<td>ae7324fa23… {UK8876;764912}</td>
<td>2014-01-17 09:08:27.000</td>
<td>MDM</td>
<td>e138c1d3c9… {UK8876}</td>
<td>d1360901d7… {764912}</td>
</tr>
</tbody>
</table>
<p>С точки зрения загрузки данных, <strong>хэш-ключи</strong> в столбце <strong>CustomerMasterHashKey</strong> должны формироваться на основе ключей из ведущей (master) системы — например, CRM. Это позволяет выполнять поиск клиентского номера из системы интернет-магазина (SHOP) путём выборки записи из таблицы <strong>Same-as-Link</strong>, где <strong>Customer1HashKey</strong> соответствует номеру из CRM. Таким образом обеспечивается консолидация клиентских идентификаторов при анализе данных.</p>
<h2>Иерархические связи (Hierarchical Links)</h2>
<p><strong>Иерархические связи</strong> используются для моделирования отношений родитель-дочерний в Data Vault. Один из распространённых примеров — иерархия спецификаций <strong>(BOM, bill of materials)</strong>, описывающая, из каких деталей состоит изделие. Например, самолёт состоит из компонентов, представленных на рисунке 5.7.</p>
<p><strong>Рисунок 5.7 Части самолёта</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1610" src="https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane.jpeg" alt="" width="966" height="647" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane.jpeg 966w, https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane-300x201.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane-768x514.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane-450x301.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_7_data_vault_parts_of_airplane-780x522.jpeg 780w" sizes="(max-width: 966px) 100vw, 966px" /></a></p>
<p>Каждая часть самолёта состоит из других, более мелких деталей. Компоненты типового турбореактивного двигателя изображены на рисунке 5.8. Все они оформлены в структуре спецификаций (BOM), показанной на рисунке 5.9.</p>
<p><strong>Рисунок 5.8 Сечение турбореактивного двигателя</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_8_data_vault_engine.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1613" src="https://datatalks.ru/wp-content/uploads/2025/06/5_8_data_vault_engine.jpeg" alt="" width="670" height="333" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_8_data_vault_engine.jpeg 670w, https://datatalks.ru/wp-content/uploads/2025/06/5_8_data_vault_engine-300x149.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_8_data_vault_engine-450x224.jpeg 450w" sizes="(max-width: 670px) 100vw, 670px" /></a></p>
<p><strong>Рисунок 5.9 Структура спецификации (BOM)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1614" src="https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material.jpeg" alt="" width="794" height="465" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material.jpeg 794w, https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material-300x176.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material-768x450.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material-450x264.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_9_data_vault_bill_of_material-780x457.jpeg 780w" sizes="(max-width: 794px) 100vw, 794px" /></a></p>
<p>Каждый элемент BOM имеет название, номер детали, количество, необходимое для сборки, и указание источника.</p>
<p>Модель Data Vault для представления такой иерархии приведена на рисунке 5.10.</p>
<p><strong>Рисунок 5.10 Логическая модель иерархической связи</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1615" src="https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design.jpeg" alt="" width="795" height="361" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design.jpeg 795w, https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design-300x136.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design-768x349.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design-450x204.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_10_data_vault_Hierarchical_link_bill_of_material_logical_design-780x354.jpeg 780w" sizes="(max-width: 795px) 100vw, 795px" /></a></p>
<p>Вместо того чтобы моделировать каждый уровень иерархии отдельным хабом, предпочтительно создать один хаб, поскольку бизнес рассматривает уровни иерархии как однотипные. С технической точки зрения они могут иметь разную степень детализации/гранулярности, но в бизнес-контексте каждый уровень — это просто часть иерархии.</p>
<p>Таким образом, <strong>иерархическая связь</strong> — это просто применение стандартной связи (link) в Data Vault. Она не нарушает модель и не требует особых правил.</p>
<h2>Неисторические связи (Nonhistorized Links)</h2>
<p>Все предыдущие примеры связей сохраняют историю отношений между бизнес-объектами. Обычно, если что-то изменилось в источнике, это отражается добавлением новой версии в спутник (satellite). Однако бывают ситуации, когда данные не должны быть изменены вообще — например, транзакционные данные или данные с датчиков. В таких случаях используется неисторическая связь.</p>
<p>Это особый тип связи, также называемый транзакционной (хотя этот термин уже считается устаревшим). Такие связи не обновляются. Если транзакция отменена, в систему загружается обратная транзакция. Исправления задним числом не допускаются.</p>
<p><strong>Примеры:</strong></p>
<ul>
<li>Транзакции продаж</li>
<li>Поток данных с камер видеонаблюдения (CCTV)</li>
<li>Сенсорные данные от IoT-устройств</li>
</ul>
<p>Видео или изображения, поступающие в Data Vault, не будут обновляться — они просто фиксируются как есть. Поэтому термин &#171;транзакционная&#187; связь заменён на неисторическая.</p>
<p><strong>Рисунок 5.11 Логическая модель неисторической связи</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_11_data_vault_Nonhistorized_link_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1616" src="https://datatalks.ru/wp-content/uploads/2025/06/5_11_data_vault_Nonhistorized_link_logical_design.jpeg" alt="" width="459" height="148" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_11_data_vault_Nonhistorized_link_logical_design.jpeg 459w, https://datatalks.ru/wp-content/uploads/2025/06/5_11_data_vault_Nonhistorized_link_logical_design-300x97.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_11_data_vault_Nonhistorized_link_logical_design-450x145.jpeg 450w" sizes="(max-width: 459px) 100vw, 459px" /></a></p>
<p>Символ аналогичен стандартной связи, за исключением индикатора рядом с иконкой, который ясно показывает, что это неисторическая связь. По историческим причинам индикатором служит буква T, как в слове <strong>transactional link (транзакционная связь)</strong>. Обратите внимание, что невозможно добавлять спутники (satellites) к неисторическим связям в логической модели (хотя существуют варианты добавления спутников в физической реализации, как мы узнаем немного позже в этом разделе). Атрибуты, являющиеся частью транзакции, добавляются непосредственно в неисторическую связь.</p>
<p>Существует два варианта физического моделирования неисторических связей в Data Vault. Первый вариант включает стандартную сущность связи и спутник без атрибута <strong>LoadEndDate</strong>. Таким образом, невозможно вставлять новые версии записей в этот спутник, поскольку нельзя установить дату окончания действия записи и заменить её другой версией. Рисунок 5.12 показывает электронный счёт-фактуру за авиаперелёт — типичную транзакцию в авиационной отрасли.</p>
<p><strong>Рисунок 5.12 Электронный счёт-фактура за авиаперелёт</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_12_data_vault_Electronic_invoice_for_flight.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1617" src="https://datatalks.ru/wp-content/uploads/2025/06/5_12_data_vault_Electronic_invoice_for_flight.jpeg" alt="" width="663" height="414" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_12_data_vault_Electronic_invoice_for_flight.jpeg 663w, https://datatalks.ru/wp-content/uploads/2025/06/5_12_data_vault_Electronic_invoice_for_flight-300x187.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_12_data_vault_Electronic_invoice_for_flight-450x281.jpeg 450w" sizes="(max-width: 663px) 100vw, 663px" /></a></p>
<p>Транзакция идентифицируется <strong>номером счёта-фактуры 0198536</strong> и была выдана 21 января 2014 года. Также указана другая информация, такая как клиент и продавец. Обратите внимание, что невозможно обновить бронирование рейса. Если информация, предоставленная во время бронирования, неверна (например, указан неправильный аэропорт назначения), единственный способ изменить бронирование — заплатить сбор за изменение и приобрести новое бронирование. Старое бронирование будет аннулировано. Поэтому обновление старого счёта-фактуры невозможно без создания нового счёта.</p>
<p><strong>Логическая модель Data Vault</strong> на рисунке 5.13 фиксирует транзакцию электронного счёта-фактуры.</p>
<p><strong>Рисунок 5.13 Неисторическая связь (физическая реализация)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1618" src="https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design.jpeg" alt="" width="798" height="369" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design.jpeg 798w, https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design-300x139.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design-768x355.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design-450x208.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_13_data_vault_Nonhistorized_link_physical_design-780x361.jpeg 780w" sizes="(max-width: 798px) 100vw, 798px" /></a></p>
<p>Связь <strong>LinkInvoice</strong> фиксирует основную транзакцию с ссылкой на клиента, ссылкой на продавца и идентификатором транзакции <strong>InvoiceNumber</strong>. По определению, этот идентификатор транзакции добавляется непосредственно в неисторическую связь. <strong>Хэш-ключ неисторической связи</strong> создаётся из бизнес-ключей ссылочных хабов и идентификатора транзакции. <strong>Спутник SatInvoice</strong> содержит все описательные атрибуты, такие как <strong>Record Locator</strong> и дата выдачи счёта-фактуры (<strong>Invoice Issue Date</strong>). Обратите внимание, что дата выдачи счёта отличается от даты загрузки записи, и поэтому она должна быть добавлена в модель.</p>
<p>Однако возможно использовать дату транзакции в качестве даты загрузки, если момент загрузки транзакции в Data Vault совпадает с фактической датой транзакции или происходит в пределах нескольких секунд. Обратите внимание, что сущности на рисунке 5.13 не отображают все описательные атрибуты, показанные в счёте-фактуре на рисунке 5.12.</p>
<p>В некоторых случаях можно отказаться от использования <strong>атрибута LoadDate</strong> в записи спутника, потому что обе записи (запись связи и сопровождающая её запись спутника) будут иметь одинаковую временную метку загрузки. Таким образом, <strong>атрибут LoadDate</strong> в спутнике хранит дублирующие данные, которые занимают место на диске. Однако бывают случаи, когда данные для обеих сущностей поступают из разных источников и доставляются последовательно, с разницей в миллисекунды. Это часто происходит, например, в сценариях реального времени, которые не рассматриваются в этой книге. В любом случае, в таких случаях <strong>атрибут LoadDate</strong> должен быть смоделирован в обеих сущностях для фиксации разницы во времени поступления данных. Ещё одной причиной моделирования атрибута в обеих сущностях является стандартизация, которая упрощает понимание сущностей для новых участников проекта.</p>
<p>Второй вариант, которого следует избегать в большинстве случаев, — это добавление атрибутов транзакции непосредственно в структуру связи и отказ от использования структуры спутника вообще. Рисунок 5.14 показывает пример такой неисторической связи.</p>
<p><strong>Рисунок 5.14 Альтернатива неисторической связи без спутника (физическая реализация)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_14_data_vault_Nonhistorized_link_alternative_without_satellite_physical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1619" src="https://datatalks.ru/wp-content/uploads/2025/06/5_14_data_vault_Nonhistorized_link_alternative_without_satellite_physical_design.jpeg" alt="" width="267" height="387" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_14_data_vault_Nonhistorized_link_alternative_without_satellite_physical_design.jpeg 267w, https://datatalks.ru/wp-content/uploads/2025/06/5_14_data_vault_Nonhistorized_link_alternative_without_satellite_physical_design-207x300.jpeg 207w" sizes="(max-width: 267px) 100vw, 267px" /></a></p>
<p><strong>Атрибуты InvoiceIssueDate и RecordLocator</strong> были перемещены из спутника в связь <strong>LinkInvoice</strong>. Спутник <strong>SatInvoice</strong> с рисунка 5.13 был полностью удалён, так как больше не требуется.</p>
<p>Этот вариант не рекомендуется, поскольку он изменяет архитектурный дизайн модели Data Vault путём внесения решений в процесс проектирования. Тем самым он увеличивает сложность модели и расходы на сопровождение. Кроме того, он усложняет автоматическую загрузку неисторических связей. Тем не менее, бывают случаи, когда второй вариант оправдан: если производительность имеет критическое значение, то есть требуется загрузка данных за миллисекунды или быстрее, может потребоваться смоделировать неисторическую связь, как показано на рисунке 5.14. Однако имейте в виду, что чрезмерная ширина таблицы связи может негативно повлиять на оптимизацию производительности. Если данные в одной строке становятся слишком широкими, это снижает количество записей на одну страницу базы данных (по крайней мере, в СУБД с построчной ориентацией, таких как Microsoft SQL Server). Физическая реализация может варьироваться в зависимости от выбранной платформы, и, как следствие, производительность загрузки и запросов к структуре связи может снижаться. Хотя это также может происходить и при использовании первого варианта, в нём можно распределить данные по нескольким спутникам, чтобы сохранить компактный размер строк.</p>
<p>Рисунок 5.15 показывает, что атрибуты транзакции распределены между спутниками. Оба спутника соответствуют определению неисторических спутников, изложенному в этом разделе. Перенос описательных данных из неисторической связи в зависимый спутник следует рассматривать, если количество фиксируемых атрибутов достаточно велико. Проблема в том, что Microsoft SQL Server хранит данные в файловых страницах размером 8 КБ, без возможности изменить этот параметр. Потенциальная ширина связи ограничена этим ограничением по размеру. По этой причине в структуру неисторической связи следует добавлять лишь ограниченное количество описательных полей для поддержания производительности.</p>
<p><strong>Рисунок 5.15 Неисторическая связь с несколькими спутниками (физическая реализация)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1620" src="https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites.jpeg" alt="" width="1142" height="385" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites.jpeg 1142w, https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites-300x101.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites-1024x345.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites-768x259.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites-450x152.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_15_data_vault_Nonhistorized_link_with_multiple_satellites-780x263.jpeg 780w" sizes="(max-width: 1142px) 100vw, 1142px" /></a></p>
<p>Обратите внимание, что <strong>Data Vault 2.0 не зависит от используемой системы баз данных.</strong> Примеры в этой книге основаны на Microsoft SQL Server, но могут быть легко перенесены в другие системы баз данных.</p>
<h2>Непояснённые связи (Nondescriptive Links)</h2>
<p><strong>Во многих случаях связи Data Vault будут иметь один или несколько спутников для предоставления контекста связи.</strong> Однако в некоторых случаях связи не будут иметь спутников. Это может происходить, если нужно указать только отношение между двумя бизнес-ключами, например, если клиент авиакомпании выразил интерес к определённому предложению, щёлкнув по рекламе на веб-сайте авиакомпании.</p>
<p>На рисунке 5.16 <strong>низкоценная связь Interest</strong> соединяет хабы <strong>Customer</strong> и <strong>Offering</strong> без предоставления дополнительного контекста.</p>
<p><strong>Рисунок 5.16 Low-value link &#8212; Низкоценная связь (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1621" src="https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design.jpeg" alt="" width="958" height="92" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design.jpeg 958w, https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design-300x29.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design-768x74.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design-450x43.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_16_data_vault_Low_value_link_logical_design-780x75.jpeg 780w" sizes="(max-width: 958px) 100vw, 958px" /></a></p>
<p><strong>Непояснённые связи также используются для хранения одного состояния в многостадийной (multistate) или ролевой (role-playing) связи.</strong> Если мы расширим предыдущий пример, мы можем создать другую связь, чтобы смоделировать другое состояние — например, что клиент был выбран для маркетинговой кампании.</p>
<p>Рисунок 5.17 показывает, что это второе состояние добавлено в модель через другую связь — Mailing. Обратите внимание, что существуют и другие способы моделирования многостадийных связей, например, с использованием комбинации спутника и таблицы кодов.</p>
<p><strong>Рисунок 5.17 Multistate low-value link &#8212; Многостадийная низкоценная связь (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1622" src="https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design.jpeg" alt="" width="957" height="233" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design.jpeg 957w, https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design-300x73.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design-768x187.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design-450x110.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_17_data_vault_Multistate_low_value_link_logical_design-780x190.jpeg 780w" sizes="(max-width: 957px) 100vw, 957px" /></a></p>
<h2>Вычисленные агрегатные связи (Computed Aggregate Links)</h2>
<p>Этот тип связи Business Vault удаляет один хаб из связи и агрегирует данные по оставшимся отношениям. Например, рассмотрим модель Data Vault, показанную на рисунке 5.18.</p>
<p><strong>Рисунок 5.18 Вычисленная агрегатная связь с вычисленным спутником (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1623" src="https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite.jpeg" alt="" width="961" height="502" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite.jpeg 961w, https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite-300x157.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite-768x401.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite-450x235.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_18_data_vault_computed_aggregated_link_with_computed_satellite-780x407.jpeg 780w" sizes="(max-width: 961px) 100vw, 961px" /></a></p>
<p><strong>Оригинальная связь LinkFlight</strong> соединяет три хаба: <strong>HubAirport</strong>, <strong>HubFlight</strong> и <strong>HubCarrier</strong>. Она обозначает рейс, запланированный авиаперевозчиком между двумя соединяющимися аэропортами с заданным номером рейса. Когда номер рейса удаляется из связи, новая связь <strong>LinkService</strong> теряет информацию о рейсе, потому что больше не содержит ссылки на <strong>HubFlight</strong>. Эта связь только указывает, какие перевозчики обслуживают какие аэропортовые соединения. Количество отдельных номеров рейсов агрегируется в атрибут <strong>FlightCount</strong> в спутнике <strong>SatService</strong>. И <strong>LinkService</strong>, и связанный спутник <strong>SatService</strong> не поступают из исходной системы. Вместо этого данные, хранящиеся в этих сущностях, рассчитываются на основе агрегатных функций.</p>
<p>Поскольку эти данные рассчитаны, а не являются «сырыми», <span style="color: #ff6600;"><strong>вычисленные агрегатные связи являются частью Business Vault.</strong></span> Сущность не подлежит аудиту, но может быть воссоздана из исходных данных <strong>LinkFlight</strong> в любой момент времени. В этом смысле вычисленная агрегатная связь является вариантом использования <strong>таблицы-моста (bridge table)</strong>.</p>
<p>Поскольку вычисленная агрегатная связь в этом примере является частью Business Vault, можно также изменить её структуру при необходимости, например, переместив вычисленный атрибут в структуру связи, как показано на рисунке 5.19.</p>
<p><strong>Рисунок 5.19 Вычисленная агрегатная связь с вычисленным атрибутом в связи (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1624" src="https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute.jpeg" alt="" width="961" height="502" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute.jpeg 961w, https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute-300x157.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute-768x401.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute-450x235.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_19_data_vault_computed_aggregate_link_with_computed_attribute-780x407.jpeg 780w" sizes="(max-width: 961px) 100vw, 961px" /></a></p>
<p>Эта опция доступна только в том случае, если вычисленная агрегатная связь является сущностью Business Vault, то есть сама связь рассчитывается из сырых данных с использованием бизнес-логики, например, оператора GROUP BY. Если данные связи вычисленной агрегатной связи поступают из исходной системы, сущность связи остаётся в Raw Data Vault (рисунок 5.20).</p>
<p><strong>Рисунок 5.20 Агрегация, вычисленная на связи Raw Data Vault (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1625" src="https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link.jpeg" alt="" width="961" height="502" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link.jpeg 961w, https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link-300x157.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link-768x401.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link-450x235.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_20_data_vault_Computed_aggregation_on_Raw_Data_Vault_link-780x407.jpeg 780w" sizes="(max-width: 961px) 100vw, 961px" /></a></p>
<p>В этом случае агрегация, которая по-прежнему рассчитывается из других данных в исходной системе, сохраняется в вычисленных спутниках и прикрепляется к сырой связи. Такая ситуация может возникнуть, если сама связь доступна в исходной системе, но агрегация — нет. В этом случае агрегация основана на других сырых данных и прикрепляется к правильному уровню детализации, которым является <strong>LinkService</strong> в примере на рисунке 5.20. Таким образом, определяющей характеристикой обеих моделей является источник данных связи: поступают ли они из исходной системы или уже являются рассчитанными. В первом случае данные моделируются как сырая связь с прикреплённым вычисленным спутником, как на рисунке 5.20. Если связь уже рассчитана из сырых данных, например с помощью оператора GROUP BY, сущность связи становится частью Business Vault, как на рисунке 5.18.</p>
<h2>Исследовательские связи (Exploration Links)</h2>
<p><strong>Исследовательские связи</strong> — это вычисленные связи, созданные исключительно по бизнес-причинам. Поэтому <strong>они являются частью Business Vault.</strong> Хотя связь между двумя хабами отсутствует в исходной системе, бизнес может принять решение создать исследовательскую связь для изучения данных (рисунок 5.21).</p>
<p><strong>Рисунок 5.21 Исследовательские связи (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1626" src="https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design.jpeg" alt="" width="961" height="234" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design.jpeg 961w, https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design-300x73.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design-768x187.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design-450x110.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_21_data_vault_Exploration_links_logical_design-780x190.jpeg 780w" sizes="(max-width: 961px) 100vw, 961px" /></a></p>
<p>Три хаба (<strong>HubAirplane</strong>, <strong>HubEngine</strong> и <strong>HubManufacturer</strong>) на рисунке 5.21 соединены друг с другом двумя связями (<strong>LinkAirplanePart</strong>, <strong>LinkManufacturer</strong>). Бизнес может принять решение проанализировать связь между этими тремя хабами, добавив <strong>LinkAirplanePartsWithManufacturer</strong>, которая является денормализованной версией обеих связей. В других случаях бизнес может решить проанализировать связь между двумя хабами, которые соединены только косвенно — в данном случае <strong>HubAirplane</strong> и <strong>HubManufacturer</strong>. Получившаяся связь <strong>LinkAirplaneWithManufacturer</strong> предоставляет такую возможность, как показано на рисунке.</p>
<p>Связи, являющиеся стандартными связями Data Vault, создаются и поддерживаются вручную, хотя бизнес может принять решение автоматизировать процесс создания такой связи. Исследовательские связи являются частью Business Vault и, следовательно, не подлежат аудиту.</p>
<p><strong> Причины создания исследовательских связей включают:</strong></p>
<ul>
<li>Определение связей и динамических сетей между бизнес-сущностями (хабами), которых нет в исходной системе</li>
<li>Представление связей, которые в противном случае были бы только косвенными</li>
<li>Объединение связей между бизнес-объектами, если один из ссылаемых хабов содержит дублирующиеся записи (см. same-as link)</li>
<li>Идентификация кластеров схожих записей внутри хабов (опять же, с использованием same-as links)</li>
<li>Автоматическое выявление шаблонов, например при обнаружении мошенничества</li>
</ul>
<h1>Применение спутников (Satellite Applications)</h1>
<p>После завершения обсуждения связей специального назначения, следующие разделы рассматривают аналогичные случаи для спутников Data Vault.</p>
<h2>Перегруженные спутники (Overloaded Satellites)</h2>
<p>Мы рекомендовали в главе 4, «Моделирование Data Vault 2.0», чтобы для каждого источника данных использовался отдельный спутник, отслеживающий атрибуты из этого источника. В некоторых случаях реализационные специалисты Data Vault пытаются объединить данные из нескольких источников в один спутник. Хотя иногда для этого есть веские причины, такой подход также несёт в себе риски.</p>
<p>Первая проблема возникает, если формат данных у каждого отдельного источника отличается, например, длина символов в атрибутах имени или адреса. Если данные различаются — а это весьма вероятно — данные очень быстро становятся «грязными».</p>
<p>Другие проблемы становятся очевидными при анализе таблицы 5.6, которая показывает извлечённые данные из перегруженного спутника.</p>
<p><strong>Таблица 5.6 Перегруженный спутник с данными из нескольких источников</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>PassengerHashKey</th>
<th>LoadDate</th>
<th>LoadEndDate</th>
<th>Record Source</th>
<th>HashDiff</th>
<th>Name</th>
<th>Addr</th>
<th>Phone</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>86f8sa7b3c…</td>
<td>2014-01-17 09:05:43.000</td>
<td> </td>
<td>TICKETING</td>
<td>10daeb8564…</td>
<td>Dan Linstedt</td>
<td>26 Prospect St</td>
<td>802-524-8566</td>
</tr>
<tr>
<td>2</td>
<td>86f8sa7b3c…</td>
<td>2014-01-17 09:05:43.000</td>
<td> </td>
<td>ONLINE</td>
<td>00ebf10b9e…</td>
<td>Daniel L</td>
<td>28 Root Beer</td>
<td>827-295-1212</td>
</tr>
<tr>
<td>3</td>
<td>86f8sa7b3c…</td>
<td>2014-01-17 09:05:43.000</td>
<td> </td>
<td>BILLING</td>
<td>ef843ac01e…</td>
<td>Dan Linste</td>
<td>26 Prospect</td>
<td>999-111-1111</td>
</tr>
<tr>
<td>4</td>
<td>86f8sa7b3c…</td>
<td>2014-01-17 09:05:43.000</td>
<td> </td>
<td>SECURITY</td>
<td>a7c8a5e9f1…</td>
<td>Dan Linstedt</td>
<td>26 Prospect St</td>
<td>802-555-152</td>
</tr>
<tr>
<td>5</td>
<td>86f8sa7b3c…</td>
<td>2014-01-17 09:05:43.000</td>
<td> </td>
<td>BAGGAGE</td>
<td>a723eca93f…</td>
<td>Dan Linstedt</td>
<td>1 Richland</td>
<td>802-555-1215</td>
</tr>
</tbody>
</table>
<p>Согласно <strong>атрибуту RecordSource,</strong> данные поступают из пяти различных источников. Поскольку каждый источник имел одинаковую структуру и использовал одни и те же типы данных, бизнес решил загружать все данные в один и тот же спутник. При анализе данных возникают следующие вопросы:</p>
<ul>
<li>Какую из исходных систем следует считать основной, если данные противоречат друг другу (как в таблице 5.6)?</li>
<li>Есть ли строки, которые замещают другие строки?</li>
<li>Какая из строк является самой актуальной?</li>
<li>Первичным ключом этого спутника должна быть комбинация <strong>PassengerHashKey</strong> и <strong>LoadDate</strong>. Однако эта комбинация полей в данном спутнике не уникальна. Следует ли включить <strong>атрибут RecordSource</strong> в первичный ключ, чтобы сделать его допустимым?</li>
<li>Если некоторые источники данных предоставляют значения NULL или вовсе не предоставляют значения для некоторых атрибутов, как нам с ними поступать?</li>
<li>Следует ли объединять или сливать данные из источников при загрузке, или оставить их как есть?</li>
</ul>
<p>Некоторые из этих вопросов подводят нас к другой проблеме, которая заключается в <strong>обнаружении изменений (delta-detection)</strong> в спутнике. Напомним, что спутники должны хранить только изменения атрибутов, а не состояние атрибута при каждой загрузке. Однако из-за описанных выше проблем обнаружение изменений становится очень сложным (поскольку мы хотим сохранять каждое изменение из каждой исходной системы, а не только из основной системы).</p>
<h2>Мультиактивные спутники (Multi-Active Satellites)</h2>
<p><strong>Мультиактивные спутники</strong> похожи на перегруженные спутники: они хранят несколько записей на один родительский ключ. Однако эти записи поступают не из разных источников, а из денормализованного источника данных, такого как <strong>COBOL copybooks</strong> или <strong>XML-файлы</strong>. Существует множество примеров допустимого использования. Например, у сотрудников может быть неограниченное количество телефонных номеров, как показано на рисунке 5.22.</p>
<p><strong>Рисунок 5.22 Пример мультиактивного спутника</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1627" src="https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite.jpeg" alt="" width="962" height="432" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite.jpeg 962w, https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite-300x135.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite-768x345.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite-450x202.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_22_data_vault_Multi_active_satellite-780x350.jpeg 780w" sizes="(max-width: 962px) 100vw, 962px" /></a></p>
<p>XML-файл слева на рисунке 5.22 представляет сотрудника с рядом телефонных номеров. Структура XML-файла преобразуется в сущность спутника Data Vault справа. Описательный атрибут (телефонный номер) — это <strong>атрибут PhoneNumber</strong>, который является единственным описательным атрибутом в этом примере. Единственное отличие от предложенной структуры в главе 4 — <strong>это PhoneSeq</strong>, номер последовательности, который представляет собой индекс, идентифицирующий телефонный номер в левой структуре. Полученные данные спутника представлены в таблице 5.7.</p>
<p><strong>Таблица 5.7 Данные мультиактивного спутника</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>EmployeeHashKey</th>
<th>PhoneSeq</th>
<th>LoadDate</th>
<th>LoadEndDate</th>
<th>RecordSource</th>
<th>HashDiff</th>
<th>PhoneNumber</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>33aa…</td>
<td>1</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>12fb…</td>
<td>1-405-1234123</td>
</tr>
<tr>
<td>2</td>
<td>33aa…</td>
<td>2</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>76ca…</td>
<td>1-213-1561234</td>
</tr>
<tr>
<td>3</td>
<td>33aa…</td>
<td>3</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>8cb1…</td>
<td>49-511-55349873</td>
</tr>
<tr>
<td>4</td>
<td>33aa…</td>
<td>4</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>9944…</td>
<td>49-30-12345678</td>
</tr>
</tbody>
</table>
<p>Данные показывают, что существует одна запись на каждый номер телефона из XML-источника. Каждая запись идентифицируется по</p>
<ul>
<li><strong>EmployeeHashKey</strong> — хеш-ключу родительского элемента спутника;</li>
<li><strong>PhoneSeq</strong> — позиции телефонного номера в XML-файле;</li>
<li>и <strong>LoadDate</strong> — метке времени первого появления данных в исходном файле.</li>
</ul>
<p>Тем не менее, с мультиактивными спутниками связаны определённые проблемы, поскольку существует зависимость от порядка детализированных записей. Если порядок номеров телефонов в XML-файле изменится, все данные по сотруднику будут восприниматься как дельта, даже если просто два номера поменялись местами без изменения самих номеров. Таблица 5.8 показывает пример таких данных.</p>
<p><strong>Таблица 5.8 Данные мультиактивного спутника с изменённым порядком в источнике</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>EmployeeHashKey</th>
<th>PhoneSeq</th>
<th>LoadDate</th>
<th>LoadEndDate</th>
<th>RecordSource</th>
<th>HashDiff</th>
<th>PhoneNumber</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>33aa…</td>
<td>1</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>12fb…</td>
<td>1-405-1234123</td>
</tr>
<tr>
<td>2</td>
<td>33aa…</td>
<td>2</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>76ca…</td>
<td>1-213-4561234</td>
</tr>
<tr>
<td>3</td>
<td>33aa…</td>
<td>3</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>8cb1…</td>
<td>49-511-55349873</td>
</tr>
<tr>
<td>4</td>
<td>33aa…</td>
<td>4</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>9944…</td>
<td>49-30-12345678</td>
</tr>
<tr>
<td>5</td>
<td>8321…</td>
<td>1</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>93ca…</td>
<td>1-205-1234123</td>
</tr>
<tr>
<td>6</td>
<td>8321…</td>
<td>2</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>328a…</td>
<td>49-40-12345678</td>
</tr>
<tr>
<td>7</td>
<td>33aa…</td>
<td>1</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>12fb…</td>
<td>1-405-1234123</td>
</tr>
<tr>
<td>8</td>
<td>33aa…</td>
<td>2</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>8cb1…</td>
<td>49-511-55349873</td>
</tr>
<tr>
<td>9</td>
<td>33aa…</td>
<td>3</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>76ca…</td>
<td>1-213-4561234</td>
</tr>
<tr>
<td>10</td>
<td>33aa…</td>
<td>4</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>9944…</td>
<td>49-30-12345678</td>
</tr>
</tbody>
</table>
<p>Первые четыре записи (записи №1–4) представляют первый порядок в исходной системе, в то время как последние четыре записи (записи №7–10) представляют порядок тех же, неизменённых записей при второй загрузке пакета. Однако старые записи из первого пакета помечены как удалённые по значению <strong>LoadEndDate</strong>, которое в этих случаях не равно null (напомним, это означает, что они были заменены).</p>
<p>Для решения этой проблемы можно использовать сам номер телефона в качестве номера последовательности. Субпоследовательность, как в таблице 5.7, должна использоваться только как архитектурный резервный вариант и только с активным сжатием таблицы. Таблица 5.9 приводит пример. Это устраняет зависимость от порядка при проверке дельт, но исключает возможность воссоздать набор данных в правильном порядке поступления. Если это важно, субпоследовательность, как показано в предыдущем примере — единственный способ. Другой вариант — перед вставкой включать существование телефонного номера в спутнике как текущей активной строки. Однако этот вариант не проверяет удалённые номера, которые могли исчезнуть из входящего набора данных.</p>
<p><strong>Таблица 5.9 Данные мультиактивного спутника с альтернативным атрибутом последовательности</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>EmployeeHashKey</th>
<th>PhoneSeq</th>
<th>LoadDate</th>
<th>LoadEndDate</th>
<th>RecordSource</th>
<th>HashDiff</th>
<th>PhoneNumber</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>33aa…</td>
<td>1-405-1234123</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>12fb…</td>
<td>1-405-1234123</td>
</tr>
<tr>
<td>2</td>
<td>33aa…</td>
<td>1-213-4561234</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>76ca…</td>
<td>1-213-4561234</td>
</tr>
<tr>
<td>3</td>
<td>33aa…</td>
<td>49-511-55349873</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee.xml</td>
<td>8cb1…</td>
<td>49-511-55349873</td>
</tr>
<tr>
<td>4</td>
<td>33aa…</td>
<td>49-30-12345678</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>9944…</td>
<td>49-30-12345678</td>
</tr>
<tr>
<td>5</td>
<td>33aa…</td>
<td>1-213-4561235</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee.xml</td>
<td>776a…</td>
<td>1-213-4561235</td>
</tr>
</tbody>
</table>
<p>Таблица показывает, что запись №2 была обновлена записью №5 во втором пакете. Запись №3 была удалена и больше не существует. Поэтому она получила <strong>конечную дату (end-dated)</strong> в спутнике. Обратите внимание, что описательный атрибут <strong>PhoneNumber</strong> дублируется в первичном ключе спутника (<strong>атрибут PhoneSeq</strong>), а не просто перемещается. Это упрощает понимание спутника для следующего пользователя, которому необходимо извлекать описательные атрибуты из спутника для бизнеса.</p>
<p>Если используется описанное решение, могут возникнуть две проблемы: во-первых, альтернативный атрибут должен быть <strong>NOT NULL</strong> и уникальным в контексте родителя, и во-вторых, производительность может значительно пострадать. Проблема с производительностью возникает, если альтернативный столбец последовательности является строкой, а не числом. Однако последовательность, составленная из символов, является лучшим решением из двух плохих (наилучший вариант из худших).</p>
<h2>Спутники отслеживания статусов (Status Tracking Satellites)</h2>
<p>Спутники отслеживания статусов используются для загрузки журналов аудита или данных из <strong>систем фиксации изменений (Change Data Capture, CDC)</strong>. Эти методы отслеживают информацию об <strong>операциях CRUD (также SCRUD)</strong> в исходной системе. Информация должна предоставляться исходной системой и включает сведения о создании (<strong>C</strong>), чтении (<strong>R</strong>), обновлении (<strong>U</strong>), удалении (<strong>D</strong>) и поиске (<strong>S</strong>) данных в исходной системе. Часто эта информация сохраняется операционной системой каждый раз, когда пользователь выполняет одну из этих операций в приложении. Таблица 5.10 предоставляет пример такой SCRUD-таблицы. Это результат функции CDC и показывает все изменения в исходной таблице.</p>
<p><strong>Таблица 5.10 Таблица фиксации изменений (CDC) для сотрудников</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>__$start_lsn</th>
<th>__$seqval</th>
<th>__$operation</th>
<th>__$update_mask</th>
<th>Employee ID</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>0x0000001C00000610004</td>
<td>0x0000001C00000610002</td>
<td>1</td>
<td>0x07</td>
<td>5</td>
<td>Chris</td>
<td>Miller</td>
</tr>
<tr>
<td>2</td>
<td>0x0000001C00000620004</td>
<td>0x0000001C00000620003</td>
<td>2</td>
<td>0x07</td>
<td>3</td>
<td>Jane</td>
<td>Brown</td>
</tr>
<tr>
<td>3</td>
<td>0x0000001C000006D0004</td>
<td>0x0000001C000006D0002</td>
<td>4</td>
<td>0x02</td>
<td>1</td>
<td>Mike</td>
<td>Freeman</td>
</tr>
<tr>
<td>4</td>
<td>0x0000001C000006E0004</td>
<td>0x0000001C000006E0002</td>
<td>4</td>
<td>0x02</td>
<td>1</td>
<td>Michael</td>
<td>Freeman</td>
</tr>
</tbody>
</table>
<div class="flex max-w-full flex-col grow">
<div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5" dir="auto" data-message-author-role="assistant" data-message-id="dace826c-c7d6-4510-8e0b-4ca12c9f5754" data-message-model-slug="gpt-4o">
<div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]">
<div class="markdown prose dark:prose-invert w-full break-words dark"><span style="font-size: revert;">Столбец <code>__$operation</code> указывает тип операции над данными. Реализация CDC в Microsoft SQL Server допускает следующие значения:</span></div>
</div>
</div>
</div>
<div class="flex min-h-[46px] justify-start">
<div class="touch:-me-2 touch:-ms-3.5 -ms-2.5 -me-1 flex flex-wrap items-center gap-y-4 p-1 select-none touch:w-[calc(100%+--spacing(3.5))] -mt-1 w-[calc(100%+--spacing(2.5))] duration-[1.5s] focus-within:transition-none hover:transition-none pointer-events-none [mask-image:linear-gradient(to_right,black_33%,transparent_66%)] [mask-size:300%_100%] [mask-position:100%_0%] motion-safe:transition-[mask-position] group-hover/turn-messages:pointer-events-auto group-hover/turn-messages:[mask-position:0_0] group-focus-within/turn-messages:pointer-events-auto group-focus-within/turn-messages:[mask-position:0_0] has-data-[state=open]:pointer-events-auto has-data-[state=open]:[mask-position:0_0]">
<ul>
<li>Удаление</li>
<li>Вставка</li>
<li>Обновление (старые значения)</li>
<li>Обновление (новые значения).</li>
</ul>
<p>Обратите внимание, что, в зависимости от приложения, журналирование операций чтения (что не поддерживается реализацией CDC в Microsoft SQL Server) может потребовать большого объёма хранения. То же самое может относиться к операциям поиска (снова, не поддерживается). Однако некоторые среды требуют этого по соображениям безопасности, чтобы предоставлять информацию о том, кто получал доступ к каким данным.</p>
<p>Спутник отслеживания статуса определяется, как на рисунке 5.23.</p>
<p><strong>Рисунок 5.23 Спутник отслеживания статуса (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1628" src="https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design.jpeg" alt="" width="956" height="408" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design.jpeg 956w, https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design-300x128.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design-768x328.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design-450x192.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_23_data_vault_Status_tracking_satellite_logical_design-780x333.jpeg 780w" sizes="(max-width: 956px) 100vw, 956px" /></a></p>
<p>Спутник отслеживания статуса на рисунке 5.23, <code>SatEmployeeStatus</code>, состоит только из одного описательного атрибута — атрибута Status, где хранятся данные из <code>__$operation</code>. Кроме того, имеется только метаданные, которые не отображаются на логических диаграммах Data Vault.<br />Данные в таблице, полученные из данных таблицы 5.10, представлены в таблице 5.11.</p>
<p><strong>Таблица 5.11 Данные спутника отслеживания статуса</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>EmployeeHashKey</th>
<th>LoadDate</th>
<th>LoadEndDate</th>
<th>RecordSource</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>5a5…</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee</td>
<td>D</td>
</tr>
<tr>
<td>2</td>
<td>389a…</td>
<td>2013-07-14 03:10:15</td>
<td>(Null)</td>
<td>Employee</td>
<td>C</td>
</tr>
<tr>
<td>3</td>
<td>1121…</td>
<td>2013-07-14 03:10:15</td>
<td>2013-07-20 02:54:04</td>
<td>Employee</td>
<td>U</td>
</tr>
<tr>
<td>4</td>
<td>1121…</td>
<td>2013-07-20 02:54:05</td>
<td>(Null)</td>
<td>Employee</td>
<td>U</td>
</tr>
</tbody>
</table>
<p>Обратите внимание, что <strong>описательные данные (например, бизнес-ключ) не хранятся в спутнике отслеживания статуса.</strong> Отслеживаются только статус и метка времени изменения статуса. Кроме того, исходные значения этих записей не отображаются (они устарели). Описательные данные загружаются в соответствующие стандартные спутники, предназначенные для захвата этих данных.<br />Кроме того, данные в спутниках отслеживания статуса должны быть нормализованы и соответствовать стандартному макету и правилам спутников. В этих таблицах должно быть включено сжатие, чтобы экономить дисковое пространство.</p>
<p>Если несколько исходных систем предоставляют информацию о статусе, следует отслеживать только информацию от основной системы (ведущей системы).<br />Хорошей практикой также является использование нескольких спутников отслеживания статуса для бизнес-ключа или отношения, тем самым разделяя спутник отслеживания статуса по источникам данных.</p>
<h2>Спутники эффективности (Effectivity Satellites)</h2>
<p><strong>Спутники эффективности часто прикреплены к сущностям-связям Data Vault</strong> и представлены на рисунке 5.24. Они отслеживают эффективность (актуальность) связи между двумя бизнес-объектами среди других применений (например, может быть полезно отслеживать актуальность бизнес-ключа в хабе). <strong>Их цель — отслеживать, когда связь активна с точки зрения бизнеса, и предоставлять даты начала и окончания для этой цели.</strong> Эти данные часто представляют собой организационно-ориентированную точку зрения, то есть когда связь (или бизнес-ключ) считается удалённой в организации.</p>
<p><strong>Рисунок 5.24 Спутник эффективности (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1629" src="https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design.jpeg" alt="" width="953" height="382" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design.jpeg 953w, https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design-300x120.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design-768x308.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design-450x180.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/5_24_data_vault_Effectivity_satellite_logical_design-780x313.jpeg 780w" sizes="(max-width: 953px) 100vw, 953px" /></a></p>
<p>Связь <strong>LinkMembership</strong> на рисунке 5.24 соединяет два хаба в модели. Хотя связь состоит только из стандартных атрибутов, которые фиксируют метаданные отношения между авиакомпанией и альянсом, таких как <strong>LoadDateTime</strong> и <strong>RecordSource</strong>, сама связь не имеет даты окончания внутри структуры связи.<br />Начало и окончание членства авиакомпании фиксируются спутником <strong>SatMembership</strong>, который зависит от связи. Для этой цели добавлены атрибуты <strong>MembershipBegin</strong> и <strong>MembershipEnd</strong>.</p>
<p>Даты начала и окончания не генерируются системой. Вместо этого они должны быть предоставлены из источника данных, например из журнала аудита Microsoft Master Data Services, дат актуальности в мастер-данных, CDC или любого другого журнала аудита из операционных систем. Чтобы пройти аудит хранилища данных, должно быть возможно отследить эти даты до исходной системы.</p>
<p>Спутники эффективности имеют смысл только в том случае, если исходная система предоставляет даты эффективности. Избегайте создания искусственных дат эффективности, если только система не предоставляет эти данные. Обычно это касается только подмножества таблиц данных или потоков. Однако чем больше источников предоставляет даты эффективности, тем лучше. Обязательно фиксируйте их в Data Vault, поскольку они часто могут использоваться для целей анализа данных (data mining).</p>
<p>Реляционная структура, показанная на рисунке 5.25, реализует пример с рисунка 5.24 и используется для отслеживания актуальности членства авиакомпаний в авиационных альянсах.</p>
<p><strong>Рисунок 5.25 Спутник эффективности (физическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_25_data_vault_Effectivity_satellite_physical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1630" src="https://datatalks.ru/wp-content/uploads/2025/06/5_25_data_vault_Effectivity_satellite_physical_design.jpeg" alt="" width="320" height="471" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_25_data_vault_Effectivity_satellite_physical_design.jpeg 320w, https://datatalks.ru/wp-content/uploads/2025/06/5_25_data_vault_Effectivity_satellite_physical_design-204x300.jpeg 204w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>
<p>Для каждой записи в таблице связей существует одна активная запись в спутнике эффективности. Также возможно вставлять обновлённые записи, например, если членство было продлено.</p>
<p>Обратите внимание, что спутники эффективности не отслеживают доступность данных в исходной системе. Это отслеживается спутниками отслеживания записей (record tracking satellites), которые фиксируют статус данных в исходных системах.</p>
<h2>Спутники отслеживания записей (Record Tracking Satellites)</h2>
<p>Иногда требуется отслеживать, какие прикладные системы-источники подают какие ключи и связи в какие циклы загрузки. Например, многие системы предоставляют данные в виде полных дампов каждый день. В некоторых случаях не все записи включаются каждый день. Вместо этого они появляются и исчезают изо дня в день без какой-либо фиксированной закономерности. Это особенно верно для устаревших мейнфрейм-систем, поскольку записи в них часто блокируются при редактировании бизнес-пользователем. Если записи выгружаются в экспортный файл одновременно с тем, как бизнес-пользователь блокирует запись для редактирования, то запись пропускается и, соответственно, не экспортируется. В экспортном файле этой записи просто нет вовсе.</p>
<p>Другая проблема заключается в том, что такие системы редко предоставляют информацию о <strong>захвате изменённых данных (CDC)</strong>. Следовательно, невозможно с уверенностью определить удалённые записи. Однако, чтобы загрузить Data Vault, нам нужно выяснить, какие записи были удалены из системы-источника (чтобы задать им дату окончания с помощью атрибута <strong>LoadEndDate</strong> в спутниках), а какие просто исчезли из экспортного файла, но появятся в одном из следующих экспортов. Последние не должны иметь дату окончания. Это похоже на <strong>LastSeenDate</strong> хабов и связей, где отмечается последняя временная метка, когда бизнес-ключ или связь в последний раз встречались в системе-источнике — по тем же самым причинам.</p>
<p>Чтобы различать случаи «отсутствует несколько дней» и «удалено», бизнес обычно устанавливает бизнес-правило для различения этих двух классов. Например, бизнес может принять решение, что все записи, которые не появлялись в течение 7 последовательных дней, следует считать удалёнными. Количество дней часто различается для разных типов данных и источников данных. Это также похоже на методы обработки и обновления <strong>LastSeenDate</strong> хабов и связей. Рисунок 5.26 показывает логическую диаграмму спутника отслеживания записей.</p>
<p><strong>РИСУНОК 5.26 Спутник отслеживания записей (логическая модель)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_26_data_vault_Record_tracking_satellite_logical_design.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1631" src="https://datatalks.ru/wp-content/uploads/2025/06/5_26_data_vault_Record_tracking_satellite_logical_design.jpeg" alt="" width="555" height="613" srcset="https://datatalks.ru/wp-content/uploads/2025/06/5_26_data_vault_Record_tracking_satellite_logical_design.jpeg 555w, https://datatalks.ru/wp-content/uploads/2025/06/5_26_data_vault_Record_tracking_satellite_logical_design-272x300.jpeg 272w, https://datatalks.ru/wp-content/uploads/2025/06/5_26_data_vault_Record_tracking_satellite_logical_design-450x497.jpeg 450w" sizes="(max-width: 555px) 100vw, 555px" /></a></p>
<p>В этом примере хаб <strong>HubPassenger</strong> расширяется спутником отслеживания записей <strong>SatPassengerTrack</strong>. Диаграмма показывает, что отслеживаются следующие источники записей для появления ключа клиента: рейсы, финансы, программа лояльности и бронирования.</p>
<p>Для наличия каждого бизнес-ключа или связи в системе-источнике в определённый момент времени вставляется запись в спутник отслеживания записей (если он существует для хаба или связи). Следовательно, спутник указывает, что данный ключ или связь присутствовали в момент отслеживания (<strong>время записи LoadDate</strong>). Таблица 5.12 показывает пример данных в спутнике с рисунка 5.26.</p>
<p><strong>Таблица 5.12 Денормализованные данные спутника отслеживания записей</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>CustomerHashKey</th>
<th>LoadDate</th>
<th>Manufacturing</th>
<th>Finance</th>
<th>Contracts</th>
<th>Sales</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>5af3…</td>
<td>2013-07-14 03:10:15</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>2</td>
<td>5af3…</td>
<td>2013-07-15 03:10:15</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>3</td>
<td>5af3…</td>
<td>2013-07-16 03:10:15</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>4</td>
<td>5af3…</td>
<td>2013-07-17 03:10:15</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
</tbody>
</table>
<p>В отличие от других спутников, спутник отслеживания записей не имеет атрибутов <strong>RecordSource</strong> и <strong>LoadEndDate</strong>. Это связано с тем, что все записи создаются системой (поэтому нет атрибута <strong>RecordSource</strong>) и записи никогда не обновляются (поэтому нет <strong>LoadEndDate</strong>). Вместо обновления записей при каждом цикле загрузки, каждый раз вставляется новая запись. Значение 1 в описательных атрибутах указывает, что ключ клиента присутствовал в системе-источнике, а значение 0 — что бизнес-ключ отсутствовал. В результате таких изменений спутники отслеживания записей не подлежат аудиту. Однако это не проблема, поскольку позволяет отклоняться от правил сущностей Data Vault, не нарушая всю модель.</p>
<p>Макет записи оптимизирован для разбиения, фильтрации и запросов. Он обеспечивает быстрый доступ к этим компонентам и определение, какие источники данных «появляются и исчезают». Однако недостатком является то, что для каждого нового источника данных, добавляемого в эту таблицу, происходит вставка, за которой следует обновление.</p>
<p>Обратите внимание, что для предотвращения взрыва объема данных каждый столбец или вся таблица должны быть сжаты. Также рекомендуется суммировать старые данные и удалять их из спутника отслеживания записей, чтобы сэкономить больше дискового пространства. Старые данные определяются бизнесом и должны включать все данные, которые не требуются для основной цели спутника — идентификации удалённых данных в системе-источнике. Альтернатива удалению таких данных — переместить их на более медленные (и потому более дешёвые) носители или на резервные ленты. <strong>Разбиение на разделы (partitioning) также может помочь в этом случае.</strong></p>
<p>Структура в таблице 5.12 показывает, что спутник отслеживания записей не управляется данными, как все сущности в Data Vault. Вместо этого он управляется структурой систем-источников: каждый раз, когда система-источник добавляется в хранилище данных и подаёт данные в родительскую таблицу этого спутника, для целей отслеживания должен быть добавлен новый столбец. Это может быть правильным подходом для вашего Data Vault, если вы готовы принимать такие частые структурные изменения. Если это не вариант, также можно нормализовать данные, как показано в таблице 5.13.</p>
<p><strong>Таблица 5.13 Нормализованные данные спутника отслеживания записей</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>CustomerHashKey</th>
<th>LoadDate</th>
<th>RecordSource</th>
<th>Appearance</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>5af3…</td>
<td>2013-07-14 03:10:15</td>
<td>Manufacturing</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>5af3…</td>
<td>2013-07-14 03:10:15</td>
<td>Finance</td>
<td>1</td>
</tr>
<tr>
<td>3</td>
<td>5af3…</td>
<td>2013-07-14 03:10:15</td>
<td>Contracts</td>
<td>1</td>
</tr>
<tr>
<td>4</td>
<td>5af3…</td>
<td>2013-07-14 03:10:15</td>
<td>Sales</td>
<td>0</td>
</tr>
<tr>
<td>5</td>
<td>5af3…</td>
<td>2013-07-15 03:10:15</td>
<td>Manufacturing</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="mt-3 w-full empty:hidden">
<div class="text-center">
<div>
<div class="inline-flex border border-gray-100 dark:border-gray-700 rounded-xl">
<div class="text-token-text-secondary flex items-center justify-center gap-4 px-4 py-2.5 text-sm whitespace-nowrap">
<p>В этом случае источник записи указывается в атрибуте <strong>RecordSource</strong>, а появление отслеживаемого бизнес-ключа или связи фиксируется в <strong>Appearance</strong>. Такая структура не требует изменений в структуре таблицы для добавления новых источников записей, поскольку новый источник требует только вставки данных в спутник отслеживания записей. Однако анализ данных спутника становится более сложным, но может быть выполнен с помощью оператора PIVOT в SQL, который доступен в Microsoft SQL Server и других СУБД.</p>
<p>Если бизнес предоставляет детализированные источники записей (чего мы стараемся придерживаться в этой книге как можно чаще), также возможно отслеживать перемещения данных внутри системы-источника: где впервые появился бизнес-ключ или связь в системе, куда он переместился и т.д. Детализированный источник записи максимально точно указывает источник. Например, <strong>источник записи &#171;CRM/Contact/Lead&#187;</strong> указывает на сущность <strong>Lead</strong> в области <strong>Contact</strong> в Microsoft CRM. Сравните эту подразумеваемую информацию с недетализированным источником записи &#171;CRM&#187;, где не указана никакая конкретная информация о происхождении данных. Чтобы извлечь максимум пользы из источника записи и тем самым предоставить как можно больше ценности для бизнеса, старайтесь использовать максимально детализированные источники записей.</p>
<p>Также рекомендуется использовать иерархическую систему, чтобы агрегировать данные на отдельных уровнях для анализа.</p>
<h2>Вычисляемые спутники (Computed Satellites)</h2>
<p>Согласно определению Data Vault хранит необработанные (сырые) данные. Однако в некоторых случаях может быть полезно хранить вычисленные данные.</p>
<p>В модели Data Vault для этого предусмотрено место — Business Vault. В разделе 2.2 главы 2 мы представили Business Vault как набор таблиц, следующих модели Data Vault и содержащих данные, изменённые согласно бизнес-правилам. Эти таблицы называются вычисляемыми спутниками и предназначены для хранения вычисленных данных — то есть данных, являющихся результатом агрегации, суммирования, корректировки, оценки и т.п. Это может быть результат процедур проверки качества данных, очистки данных или корректировки адресов.</p>
<p>Обычно бизнес хочет выполнять такие операции только один раз перед распространением в <strong>информационные витрины (information marts)</strong>, чтобы сэкономить вычислительные ресурсы. Вычисляемый спутник предназначен именно для этой цели: он хранит данные до их распространения. При этом структура вычисляемого спутника такая же, как у стандартного спутника. Единственное отличие — источник записи указывает, что данные сгенерированы системой. Также можно указать функцию, операцию или приложение, выполняющее вычисления для спутника, особенно если существует несколько источников данных, загружающих один и тот же вычисляемый спутник.</p>
<p>Поскольку для вычисленных данных нет прямого сырого источника, они по своей природе не подлежат аудиту. Однако возможно, что аудитор захочет изучить логику вычислений или, по крайней мере, увидеть, как, когда и что представляли собой данные до передачи их в информационные витрины. Вычисляемый спутник — это место, где можно это показать.</p>
<p>Логический символ вычисляемых спутников представлен на рисунке 5.27.</p>
<p><strong>Рисунок 5.27 Вычисляемый спутник (логический символ)</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/5_27_data_vault_Computed_satellite_logical_symbol.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1632" src="https://datatalks.ru/wp-content/uploads/2025/06/5_27_data_vault_Computed_satellite_logical_symbol.jpeg" alt="" width="267" height="89" /></a></p>
<p>Кроме значка на фигуре, отличий от стандартных спутников нет. Как уже упоминалось, структура такая же. Снова, различие заключается в источнике данных, поскольку в этом типе сущности хранятся вычисленные данные.</p>
</div>
</div>
</div>
</div>
</div>


<p class="wp-block-paragraph"></p>
<p>Сообщение <a href="https://datatalks.ru/data-vault-chapter-5-intermediate-data-vault-modeling/">Перевод 5 Главы &#8212; Intermediate Моделирование Data Vault</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datatalks.ru/data-vault-chapter-5-intermediate-data-vault-modeling/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Перевод 1 Главы &#8212; Введение в хранилища данных</title>
		<link>https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/</link>
					<comments>https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/#respond</comments>
		
		<dc:creator><![CDATA[Data Engineer (Admin)]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 20:27:13 +0000</pubDate>
				<category><![CDATA[Data Vault 2.0]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Data Vault 2.0 Architecture]]></category>
		<category><![CDATA[Data Vault 2.0 Methodology]]></category>
		<category><![CDATA[Data Vault 2.0 Modeling]]></category>
		<category><![CDATA[Enterprise Data Warehouse]]></category>
		<category><![CDATA[Raw Data Vault]]></category>
		<category><![CDATA[Variety]]></category>
		<category><![CDATA[Velocity]]></category>
		<category><![CDATA[Volume]]></category>
		<guid isPermaLink="false">https://datatalks.ru/?p=1101</guid>

					<description><![CDATA[<p>Перевод книги &#171;Building a Scalable Data Warehouse with Data Vault 2.0&#187; подготовлен автором сайта Глава 1 &#171;Введение в хранилища данных&#187; Аннотация В этой главе вводится базовая терминология хранилищ данных, их применения и бизнес-контекст. Дается краткое описание их истории и направления развития. Представлены основные архитектуры хранилищ данных, принятые в индустрии. Описаны проблемы, с которыми сталкиваются специалисты [&#8230;]</p>
<p>Сообщение <a href="https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/">Перевод 1 Главы &#8212; Введение в хранилища данных</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Перевод книги &#171;Building a Scalable Data Warehouse with Data Vault 2.0&#187; подготовлен автором сайта</em></p>
<h1>Глава 1 &#171;Введение в хранилища данных&#187;</h1>
<h2>Аннотация</h2>
<p>В этой главе вводится базовая терминология хранилищ данных, их применения и бизнес-контекст. Дается краткое описание их истории и направления развития. Представлены основные архитектуры хранилищ данных, принятые в индустрии. Описаны проблемы, с которыми сталкиваются специалисты по хранилищам данных, включая такие темы, как большие данные, изменяющиеся бизнес-требования, проблемы производительности, сложность, аудитируемость, контрольные точки перезапуска и колебания в составе команды.</p>
<p><strong>Ключевые слова</strong></p>
<ul>
<li>данные</li>
<li>хранилище данных</li>
<li>большие данные</li>
<li>системы поддержки принятия решений</li>
<li>масштабируемость</li>
<li>бизнес-аналитика</li>
</ul>
<p>Информация стала важнейшим активом любой организации. Корпоративные пользователи на всех уровнях, включая оперативное управление, средний и высший менеджмент, запрашивают информацию, чтобы принимать обоснованные решения и приносить пользу бизнесу. Каждый уровень имеет свои требования к запрашиваемой информации, но среди общих характеристик можно выделить точность, полноту и согласованность, если назвать лишь некоторые.</p>
<p>Рациональный менеджер использует доступную и проверенную информацию как основу для взвешенных решений, которые потенциально могут повлиять на конечный результат бизнеса.</p>
<p>Когда мы используем термины «данные» или «информация», мы часто применяем их взаимозаменяемо. Однако оба этих термина, а также термины «знание» и «мудрость» имеют значимые и четкие различия. В то же время они взаимосвязаны в иерархии информации.</p>
<p><strong>РИСУНОК 1.1 Иерархия информации</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-1135 size-full" src="https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy.jpeg" alt="" width="899" height="630" srcset="https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy.jpeg 899w, https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy-300x210.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy-768x538.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy-450x315.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/02/1_1_the_information_hierarchy-780x547.jpeg 780w" sizes="(max-width: 899px) 100vw, 899px" /></a></p>
<p><strong>Данные, находящиеся внизу иерархии,</strong> представляют собой конкретные, объективные факты или наблюдения.</p>
<p>Примеры могут выражаться в виде утверждений, таких как «Рейс DL404 прибывает в 08:30 утра» или «LAX находится в Калифорнии, США». Такие факты сами по себе не несут внутреннего смысла, но могут быть легко зафиксированы, переданы и сохранены в электронном виде.</p>
<p><strong>Информация представляет собой конденсированную форму исходных данных.</strong> Бизнес-пользователи превращают данные в информацию, организуя их в единицы анализа (например, клиенты, продукты, даты) и наделяя их значимостью и целью. Важно, чтобы эта значимость и цель учитывались в контексте, в котором информация получена и используется. Менеджеры одного функционального подразделения имеют другие информационные потребности, чем менеджеры из других подразделений, и рассматривают информацию со своей точки зрения. Аналогично, эти информационные потребности различаются на разных уровнях организационной иерархии. Как правило, чем выше пользователь информации находится в организационной иерархии, тем более обобщенная (или конденсированная) информация ему требуется.</p>
<p><strong>Знание, находящееся ближе к вершине иерархии информации,</strong> представляет собой информацию, которая была синтезирована и помещена в контекст, чтобы принести ценность. Менеджеры используют информацию и добавляют к ней собственный опыт, суждения и мудрость, создавая знание, которое является более богатым и глубоким, чем информация, и, следовательно, более ценным. Это сочетание исходной информации с ценностями, правилами и дополнительными сведениями из других контекстов.</p>
<p><strong>Верхний уровень пирамиды представлен мудростью,</strong> которая помещает знание из нижележащего слоя в структуру, позволяющую применять его к неизвестным и не обязательно интуитивным ситуациям. Поскольку знание и мудрость трудно структурировать и они часто являются неявными, их сложно зафиксировать в машинных системах и передать. Именно поэтому целью хранилищ данных не является создание знания или мудрости. Вместо этого хранилища данных (или бизнес-аналитика) сосредоточены на агрегировании, консолидации и обобщении данных в информацию путем помещения данных в правильный контекст.</p>
<p>Из-за ценности, которую информация предоставляет пользователям в организации, информационные активы должны быть легко доступны по запросу пользователя и соответствовать ожидаемому качеству. В прошлом этот анализ проводился непосредственно на операционных системах, таких как интернет-магазин или система управления взаимоотношениями с клиентами (CRM). Однако из-за огромных объемов данных в современных организациях извлечение полезной и значимой информации из таких необработанных данных становится проблемой для аналитических бизнес-пользователей.</p>
<p>Еще одной проблемой является наличие в типичной организации изолированных баз данных, называемых «островками данных». Единственными связями между этими островками данных и другими источниками данных являются бизнес-ключи, используемые для идентификации бизнес-объектов в обеих системах. Поэтому интеграция разрозненных источников данных должна осуществляться на основе этих бизнес-ключей, но часто выходит за рамки возможностей обычного бизнес-аналитика.</p>
<p>Операционные пользователи часто выполняют запросы или обновляют данные конкретного бизнес-объекта в своей повседневной работе. Эти операции выполняются с помощью транзакционных запросов. Примеры включают создание заявки в службу поддержки, бронирование авиабилета или отправку электронного письма. В этих случаях операционный пользователь работает с бизнес-объектами, которые являются частью его бизнес-процессов.</p>
<p>Пользователи среднего или высшего менеджмента часто выполняют другие задачи. Им требуется информация о бизнесе или бизнес-подразделении, за которое они несут ответственность. Они используют эту информацию для принятия управленческих решений. Для этого они часто выполняют аналитические запросы к базе данных, чтобы обобщить данные за определенный период. Таким образом, они преобразуют необработанные данные, например транзакции по продажам, в более полезную информацию, например отчет о продажах по месяцам и клиентам.</p>
<p>Такие аналитические запросы отличаются от транзакционных, так как они часто агрегируют или суммируют большой объем исходных данных. Если бизнес-пользователь выполняет аналитический запрос к операционной базе данных, система управления реляционной базой данных (RDBMS) должна извлечь все связанные записи с дискового хранилища для выполнения агрегации.</p>
<h2>История хранилищ данных</h2>
<p>До появления хранилищ данных пользователи должны были запрашивать необходимую информацию непосредственно из необработанных данных, хранящихся в операционных системах, как описано во введении к этой главе. Эти необработанные данные часто хранятся в реляционных базах данных, обслуживающих пользовательские приложения.</p>
<p>Хотя выполнение запросов к операционной базе данных позволяет бизнес-пользователям получать информацию в реальном времени, использование аналитических запросов для преобразования исходных данных в полезную информацию замедляет работу операционной базы данных. Это связано с необходимостью агрегирования, требующего чтения большого количества записей в реальном времени для получения сводной информации (например, объем продаж за месяц, доход за год и т. д.).</p>
<p>Использование одной и той же базы данных как для операционных, так и для аналитических пользователей часто перегружает базу данных и снижает удобство работы с данными для обеих групп пользователей.</p>
<h3><strong>Системы поддержки принятия решений</strong></h3>
<p>Для обеспечения быстрого доступа к информации, необходимой для процессов принятия решений, предприятия внедрили системы поддержки принятия решений (Decision Support Systems, DSS). Такие системы объединяют различные расширяемые и интерактивные ИТ-технологии и инструменты, которые помогают менеджерам в принятии решений путем обработки и анализа данных.</p>
<p>Для достижения своих целей DSS включает базу данных аналитических моделей, которая наполняется выбранными данными, извлекаемыми из исходных систем. Исходные системы — это операционные системы, доступные в организации, но они также могут включать любые другие источники корпоративных данных. Примеры таких данных могут включать обменные курсы, информацию о погоде или любые другие сведения, необходимые менеджерам для обоснованного принятия решений. Необработанные данные агрегируются внутри базы данных аналитических моделей или на этапе загрузки в систему.</p>
<p>Для загрузки данных используются инструменты ETL (extract, transform, load — извлечение, преобразование, загрузка), предназначенные для извлечения, преобразования и загрузки данных из источников в целевые хранилища:</p>
<p>База данных аналитических моделей на Рисунке 1.2 наполняется процессом ETL данными из пяти источников. Затем данные агрегируются либо в процессе ETL (на этапе подготовки данных), либо при выполнении бизнес-пользователем запроса к базе данных. Бизнес-пользователи могут выполнять ad-hoc запросы и другие сложные аналитические запросы к базе данных аналитических моделей. В большинстве случаев данные уже подготовлены для их целей и содержат только релевантную информацию.</p>
<p>Поскольку система поддержки принятия решений отделена от исходных систем, взаимодействие с DSS не замедляет работу операционных систем.</p>
<p><strong>РИСУНОК 1.2 Система поддержки принятия решений</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-1136 size-full" src="https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system.jpeg" alt="" width="918" height="472" srcset="https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system.jpeg 918w, https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system-300x154.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system-768x395.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system-450x231.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/02/1_2_Decision_support_system-780x401.jpeg 780w" sizes="(max-width: 918px) 100vw, 918px" /></a></p>
<p>В следующем разделе рассматриваются системы хранилищ данных, которым посвящена эта книга. Эти системы были внедрены в 1990-х годах и с тех пор обеспечивают работу backend-части систем поддержки принятия решений.</p>
<h3><strong>Системы хранилищ данных</strong></h3>
<p><strong>Система хранилища данных (Data Warehouse, DWH)</strong> — это система поддержки принятия решений, основанная на данных. Она поддерживает процесс принятия решений на стратегическом уровне, а также операционные решения, например, аналитику в реальном времени для выявления мошенничества с кредитными картами или динамические рекомендации товаров и услуг.</p>
<p>Хранилище данных предоставляет бизнес-пользователям на всех целевых уровнях неизменяемые, тематически ориентированные данные, которые интегрированы и согласованы. Тематическая ориентация отличается от функциональной ориентации ERP или операционной системы тем, что фокусируется на конкретных предметных областях для анализа. Примерами предметных областей в страховой компании могут быть клиент, страховой полис, страховая премия и страховой случай. В производственной компании предметные области могут включать продукт, заказ, поставщика, спецификацию материалов и сырье. Такой подход позволяет интегрированный анализ всех данных, связанных с одним и тем же реальным событием или объектом.</p>
<p>Прежде чем бизнес-пользователи смогут использовать информацию, предоставляемую хранилищем данных, данные загружаются из исходных систем в хранилище данных. Как было описано во введении к этой главе, интеграция различных источников данных внутри организации или за ее пределами часто осуществляется на основе бизнес-ключей. Это становится проблемой, если бизнес-объект, например клиент, имеет разные бизнес-ключи в каждой системе. Такая ситуация может возникнуть, если в одной системе номер клиента является алфавитно-цифровым, а другая операционная система позволяет использовать только числовые идентификаторы.</p>
<p>Другие проблемы возникают, когда база данных операционной системы содержит &#171;грязные&#187; данные, что часто случается при отсутствии бизнес-правил или при наличии устаревшей или некорректной информации. Примеры &#171;грязных&#187; данных включают опечатки, ошибки передачи данных или нечитабельный текст, обработанный системой оптического распознавания символов (OCR). Прежде чем такие данные могут быть представлены бизнес-пользователям в традиционном хранилище данных, они должны пройти очистку, что является частью процесса загрузки данных в витрину данных. Другие проблемы включают несовместимые типы данных или разные кодировки символов в различных исходных системах. Однако существуют исключения из процедуры очистки данных, например, если необходимо отразить качество данных для бизнес-пользователей.</p>
<p>Еще одной задачей, часто выполняемой при загрузке данных в хранилище, является агрегирование исходных данных до требуемого уровня детализации. Гранулярность данных — это единица данных, которую поддерживает хранилище. Примером различной гранулярности данных является разница между данными по конкретному продавцу и данными по региону продаж. В некоторых случаях бизнес-пользователи хотят анализировать только продажи в регионе и не интересуются продажами отдельного продавца. В других случаях бизнес-аналитики, напротив, хотят изучить продажи конкретного продавца, например, при расчете комиссионных.</p>
<p>В большинстве случаев инженеры хранилищ данных стремятся загружать данные с максимально возможной детализацией, чтобы обеспечить возможность многослойного анализа. Однако в некоторых случаях операционные системы предоставляют только исходные данные с высокой степенью агрегирования.</p>
<p>Важной характеристикой многих хранилищ данных является сохранение исторических данных. Все данные, загруженные в хранилище, сохраняются и доступны для временного анализа. Это позволяет отслеживать изменения данных с течением времени и часто является требованием бизнес-пользователей, например, для анализа динамики продаж в определенном регионе за последние кварталы. Поскольку данные в хранилище являются историческими и в большинстве случаев больше не доступны в исходных системах, они считаются неизменяемыми. Это также является важным требованием для аудируемости информационной системы.</p>
<p>Следующий раздел представляет корпоративные хранилища данных, которые являются дальнейшим развитием хранилищ данных и предоставляют централизованный обзор всей организации.</p>
<h2>Среда корпоративного хранилища данных</h2>
<p><strong>Корпоративные хранилища данных (Enterprise Data Warehouse, EDW)</strong> возникли из обычных хранилищ данных, описанных в предыдущем разделе. Вместо того чтобы сосредотачиваться на одной предметной области для анализа, корпоративное хранилище данных стремится представить все бизнес-данные организации и ее бизнес-правила. Данные в хранилище затем представляются таким образом, чтобы все необходимые предметные области были доступны для бизнес-пользователей.</p>
<p>Следующие разделы представляют основные бизнес-требования к корпоративным хранилищам данных.</p>
<h3><strong>Доступ</strong></h3>
<p>Доступ к EDW требует, чтобы конечные пользователи могли подключаться к хранилищу данных с предложенных клиентских рабочих станций. Подключение должно быть немедленным, по запросу и с высокой производительностью. Однако для пользователей, особенно бизнес-пользователей, доступ означает гораздо больше, чем просто доступность: им должно быть легко понимать значение информации, представленной системой. Это включает в себя правильное обозначение содержимого хранилища данных, а также наличие соответствующих приложений для анализа, представления и использования информации, предоставляемой хранилищем данных.</p>
<h3><strong>Несколько предметных областей</strong></h3>
<p>Поскольку каждая функция или подразделение предприятия имеет разные требования к анализируемым данным, корпоративное хранилище данных должно предоставлять несколько предметных областей, чтобы удовлетворить потребности отдельных пользователей. Каждая предметная область содержит данные, которые являются релевантными для пользователя. Пользователь запрашивает данные, и хранилище данных предоставляет ожидаемую версию истины, что означает соответствие требуемому определению информации.</p>
<p>Для достижения этой цели все исходные данные, необходимые для предметных областей, интегрируются, очищаются и загружаются в корпоративное хранилище данных. Затем они используются для построения витрин данных, разработанных для конкретной предметной области. Такие витрины данных также называются зависимыми витринами данных, поскольку они зависят от хранилища данных как источника данных. В отличие от них, независимые витрины данных получают данные непосредственно из операционных систем. Поскольку такой подход требует тех же усилий по очистке и интеграции данных, что и построение хранилища данных, часто оказывается проще загружать данные из центрального хранилища данных.</p>
<h3><strong>Единая версия истины</strong></h3>
<p>Интеграция всех доступных в организации бизнес-данных направлена на достижение единой версии истины в данных. В типичной организации существует множество операционных систем или даже обычных хранилищ данных. Хотя некоторые из этих систем интегрированы, часто наблюдается несоответствие данных, хранящихся в операционных базах данных. Это может быть связано с задержками или ошибками синхронизации, ручным вводом данных или использованием различных исходных источников данных для операционной информации. В результате в организации могут существовать разные версии истины, например, относительно адреса доставки клиента.</p>
<p>Бизнес должен самостоятельно решать, как очищать данные при их загрузке в корпоративное хранилище данных, что часто требует выбора ведущих систем или определения приоритетов источников данных. В некоторых случаях автоматический выбор и проверка на основе бизнес-правил оказывается достаточным, а в других требуется ручной выбор для получения проверенной, единой версии истины.</p>
<p>Последовательная, единая версия истины корпоративного хранилища данных является важной целью для его пользователей. Однако разные отделы часто требуют уникальную версию истины, поскольку у них может быть разное определение того, «что является истиной». Именно поэтому корпоративное хранилище данных предоставляет несколько предметных областей, как описано в предыдущем разделе. Каждая предметная область предоставляет необходимую информацию своим пользователям в нужном контексте.</p>
<h3><strong>Единая версия фактов</strong></h3>
<p>В то время как цель «единой версии истины» заключается в предоставлении интегрированной, очищенной версии организационной информации, то есть агрегированных и консолидированных данных в определенном контексте, цель «единой версии фактов» — это предоставление всех данных, в любое время. В этом случае корпоративное хранилище данных (EDW) должно хранить и потенциально предоставлять все исходные данные, которые критичны для деятельности организации (см. следующий раздел).</p>
<p>Ведущий автор этой книги был одним из первых специалистов в индустрии хранилищ данных, кто продвигал эту идею, особенно из-за требований к соответствию нормативным требованиям. В конечном итоге это привело к созданию концепции Data Vault, которая стала ключевым принципом в модели Data Vault 2.0 и реализуется в Raw Data Vault.</p>
<p>Единая версия фактов также важна с точки зрения аудита и соответствия нормативным требованиям, что будет рассмотрено в разделе 1.2.10. Позже в этой книге мы узнаем, что EDW, основанные на Data Vault, предоставляют обе версии: и единую версию истины, и единую версию фактов.</p>
<h3><strong>Критическая важность для бизнеса</strong></h3>
<p>Из-за значимости хранилища данных как основы для стратегических бизнес-решений центральное хранилище данных становится критически важным корпоративным активом. Более того, хранилища данных не только предоставляют агрегированные данные для принятия бизнес-решений, но также передают обогащенную информацию обратно в операционные системы для поддержки обработки транзакций, создания персонализированных предложений и демонстрации промо-акций по дополнительным продажам.</p>
<p>Критическая важность также требует определенного уровня качества данных в хранилище данных. Если исходные системы не предоставляют данные в требуемом качестве, задача хранилища данных — исправить любые проблемы с качеством данных и улучшить их с помощью очистки данных, интеграции данных или других подходящих методов.</p>
<h3><strong>Масштабируемость</strong></h3>
<p><strong>Масштабируемость</strong> — это способность архитектуры хранилища данных адаптироваться к увеличению объемов данных и росту количества пользовательских запросов, которые необходимо обрабатывать. Архитектура должна быть построена таким образом, чтобы поддерживать добавление новых данных — не только увеличивающихся объемов, но и более сложных данных. Если объем данных превышает возможности оборудования, должна быть возможность распределять хранилище данных между несколькими машинами и полностью использовать возможности добавленного оборудования. Этот концепт называется массово-параллельной обработкой (MPP, Massively Parallel Processing). Если архитектура не является масштабируемой, добавление нового оборудования либо не оказывает никакого эффекта, либо дает лишь минимальное улучшение после достижения определенного уровня расширения.</p>
<p>Еще одна проблема в области хранилищ данных заключается в том, что внесение изменений в хранилище часто оказывается сложным из-за существующих зависимостей. Если построение первой версии хранилища данных было относительно простым, то создание второй версии занимает гораздо больше времени. Это связано с тем, что архитектура хранилища данных изначально не была спроектирована с учетом возможных изменений.</p>
<p>В разделе 1.4 рассматриваются различные архитектуры хранилищ данных. В Главе 2 будет предложена альтернативная архитектура масштабируемого хранилища данных. Ее преимущество заключается, в том числе, в высокой масштабируемости при внесении изменений в модель данных.</p>
<h3><strong>Большие данные (Big Data)</strong></h3>
<p><strong>Big Data</strong> — это не просто «много данных» или «больше данных, чем я могу обработать». Мы определяем Big Data по трем характеристикам:</p>
<ul>
<li>Объем (<strong>Volume</strong>)</li>
<li>Скорость (<strong>Velocity</strong>)</li>
<li>Разнообразие (<strong>Variety</strong>)</li>
</ul>
<p><strong>Первая характеристика — это объем данных Volume.</strong> Часто под Big Data подразумевают значительно больший объем данных, чем тот, с которым пользователь привык работать. Однако это понятие субъективно: Big Data для одного человека или компании может означать 1 ГБ сырых данных, но это будет считаться малым объемом для того, кто загружает терабайты или даже петабайты данных.</p>
<p>Загрузка данных в режиме реального времени предъявляет особые требования, и, соответственно, определение Big Data в этом случае отличается от определения при загрузке данных ночными пакетами или в режиме, близком к реальному времени (near real-time, когда данные из операционных систем доступны в хранилище данных в течение, как правило, 15 минут).</p>
<p>Определение Big Data также зависит от доступного оборудования хранилища данных.</p>
<p><strong>Вторая характеристика — скорость Velocity.</strong> В источниках данных содержится не просто огромный объем статической информации — процесс загрузки этих данных сам по себе может быть сложной задачей. Однако данные в операционных системах часто постоянно изменяются. Чем больше данных содержится в системе-источнике, тем больше изменений в ней происходит.</p>
<p>Таким образом, типичный Big Data-проект должен работать с большим количеством обновлений, изменяющихся данных и новых данных, которые добавляются в систему-источник.</p>
<p><strong>Третья характеристика — разнообразие Variety.</strong> Big Data часто не имеют единой структуры. Структура данных может изменяться со временем или вообще отсутствовать, как в случае неструктурированных данных (например, текстов, мультимедиа).</p>
<p>Вместо использования колонок и строк реляционных таблиц неструктурированные наборы данных используют другие типы структур, например, лингвистические структуры. С точки зрения вычислений такие данные считаются неструктурированными, поскольку их структура не так очевидна, как в реляционных таблицах.</p>
<p>В других случаях Big Data представляют собой совокупность данных из множества небольших источников, но в таком количестве, что их суммарный объем становится значительным, а структура данных — очень разнообразной.</p>
<p>Поскольку объем доступных данных постоянно растет, архитектура хранилища данных должна не только масштабироваться (volume), но и эффективно обрабатывать скорость поступления данных (velocity) и их разнообразие (variety).</p>
<p>В некоторых случаях данные постоянно находятся в движении: это означает, что они обрабатываются или передаются частями, которые меньше исходного набора данных. Например, передача данных по сети TCP/IP: передаваемые данные разбиваются на IP-пакеты, которые затем передаются через сеть.</p>
<p>Это создает дополнительные проблемы для Big Data, поскольку данные постоянно поступают в сеть и выходят из нее. Чтобы их проанализировать, их необходимо собирать, объединять и агрегировать — в некоторых случаях в реальном времени.</p>
<p>Это повышает требования к архитектуре и планированию Big Data и подводит нас к вопросам производительности, которые рассматриваются в следующем разделе.</p>
<h3><strong>Проблемы производительности</strong></h3>
<p>Еще одной проблемой в хранилищах данных является производительность системы. Производительность играет важную роль при загрузке новых порций данных из источников в хранилище данных, поскольку процесс загрузки включает очистку и интеграцию данных в рамках доступного временного окна. Часто это окно ограничивается временем, когда пользователи не работают с системой, обычно в ночное время.</p>
<p>Другой причиной важности производительности является удобство использования хранилища данных, которое зависит от времени отклика системы на аналитические запросы пользователей.</p>
<p>Производительность систем хранилищ данных зависит от того, как система управления базами данных (СУБД) хранит данные на диске. Данные сохраняются в страницах фиксированного размера. Например, Microsoft SQL Server выделяет 8 КБ дискового пространства на каждую страницу. Каждая страница содержит несколько записей определенной таблицы. Чем шире таблица (чем больше у нее колонок), тем меньше строк может поместиться на одной странице.</p>
<p>Чтобы получить содержимое определенного столбца в определенной строке, необходимо считать всю страницу, на которой находятся эти данные. Поскольку аналитические запросы, часто используемые в хранилищах данных, выполняют агрегацию информации, приходится считывать много страниц для извлечения всего лишь одной строки.</p>
<p>Пример типичной агрегации — подсчет общей суммы продаж в заданном регионе. Это может быть суммирование значений в столбце invoice_total. Если в таблице много столбцов, система вынуждена загружать избыточные данные, которые не нужны для выполнения агрегации.</p>
<p>Поэтому одна из целей хранилищ данных — уменьшение ширины столбцов, что помогает улучшить производительность. Подобные принципы применяются и при загрузке новых данных в хранилище.</p>
<p>Другие способы улучшения производительности систем хранилищ данных включают:</p>
<ul>
<li><strong>Параллелизацию загрузочных шаблонов</strong> – вместо последовательной загрузки таблиц по одной, загружается несколько таблиц одновременно.</li>
<li><strong>Распределение данных между несколькими узлами</strong> – используется в MPP-системах (массово-параллельная обработка), таких как NoSQL-базы данных.</li>
</ul>
<p>Оба этих метода критически важны для Data Vault 2.0 и повлияли на изменения в моделировании Data Vault по сравнению с первой версией (Data Vault 1.0).</p>
<h3><strong>Сложность</strong></h3>
<p>Системы хранилищ данных часто сталкиваются с проблемами сложности из-за множества бизнес-требований. Технические сложности возникают в трех областях:</p>
<ul>
<li>Проблемы источников данных (<strong>sourcing issues</strong>).</li>
<li>Проблемы трансформации данных (<strong>transformation issues</strong>).</li>
<li>Проблемы загрузки в целевые системы (<strong>target issues</strong>).</li>
</ul>
<h4><strong>Проблемы источников данных</strong></h4>
<p>Эти проблемы связаны с системами, из которых извлекаются данные. К типичным проблемам относятся:</p>
<ul>
<li>Ограниченная доступность систем-источников.</li>
<li>Использование межсистемных объединений (joins), фильтрации или агрегации.</li>
<li>Проблемы с индексами в исходных данных.</li>
<li>Отсутствие ключей источника или даже полных наборов данных.</li>
<li>Некачественные или вышедшие за допустимые пределы данные.</li>
<li>Сложность структуры данных в системе-источнике.</li>
<li>Нагрузка на CPU, RAM и диск в системе-источнике.</li>
<li>Блокировки транзакционных записей.</li>
</ul>
<h4><strong>Проблемы трансформации данных</strong></h4>
<p>Эти проблемы возникают при преобразовании данных, чтобы они соответствовали ожиданиям целевой системы. Часто при трансформации выполняются следующие операции:</p>
<ul>
<li>Очистка данных.</li>
<li>Управление качеством данных и их согласование.</li>
<li>Объединение (joins), консолидация, агрегация и фильтрация.</li>
<li>Присвоение последовательностей, что часто препятствует параллельной обработке.</li>
<li>Коррекция типов данных и обработка ошибок.</li>
<li>Проблемы с сортировкой данных, такие как необходимость в больших кешах, частые переполнения диска и работа с большими ключами.</li>
<li>Применение бизнес-правил непосредственно при трансформации данных.</li>
<li>Множественные источники и целевые системы в одном потоке данных.</li>
<li>Узкие места в трансформации (transformation bottlenecks).</li>
</ul>
<h4><strong>Проблемы загрузки в целевые системы</strong></h4>
<p>Эти проблемы возникают при загрузке данных в хранилище и включают:</p>
<ul>
<li>Отсутствие оптимизации базы данных.</li>
<li>Обновление индексов, что может приводить к взаимоблокировкам (deadlocks).</li>
<li>Одновременное выполнение INSERT, UPDATE и DELETE в одном потоке данных, что замедляет обработку из-за необходимости соблюдать определенный порядок выполнения.</li>
<li>Загрузка нескольких целевых систем одновременно.</li>
<li>Широкие таблицы, как обсуждалось в разделе 1.2.8.</li>
<li>Отсутствие контроля над разбиением данных (partitioning) в целевой системе.</li>
</ul>
<h4><strong>Основная причина проблем</strong></h4>
<p>Часто системы хранилищ данных пытаются выполнить слишком много операций в одном цикле загрузки, вместо того чтобы разделить процесс на более простые этапы. В результате процессы загрузки становятся чрезмерно сложными, что снижает производительность и увеличивает затраты на сопровождение.</p>
<p>В конечном итоге это негативно сказывается на гибкости и эффективности всей команды, так как она вынуждена исправлять проблемы, а не разрабатывать новые функции.</p>
<h3><strong>Аудит и соответствие требованиям</strong></h3>
<p>Обычное требование к хранилищу данных — возможность предоставлять информацию об источнике и времени извлечения данных, хранящихся в системе. <strong>Это требование обусловлено несколькими причинами:</strong></p>
<ul>
<li>Разработчики хранилища данных стремятся выявлять возможные ошибки и понимать поток данных в системе.</li>
<li>Ценность данных зависит от их источника или возраста. Эта информация может использоваться в бизнес-правилах.</li>
<li>Соответствие нормативным требованиям (compliance) требует отслеживания потока данных и процессов, если информация используется как основа для бизнес-решений. Должно быть четко видно, откуда поступили данные и когда они были загружены в хранилище.</li>
</ul>
<p><strong>Однако Inmon приводит аргументы против добавления аудита в хранилище данных:</strong></p>
<ul>
<li>Аудит требует загрузки дополнительных данных, которые в противном случае не загружались бы в хранилище.</li>
<li>Это может изменить расписание загрузки данных. Например, если хранилище данных будет единственным местом аудита, это потребует загрузки всех изменений операционных данных, а не только ежедневных пакетных обновлений, как это принято в большинстве проектов хранилищ данных.</li>
<li>Требования к резервному копированию и восстановлению изменяются кардинально, если требуется аудит.</li>
<li>Аудитирование источников данных вынуждает хранилище данных загружать исходные данные с максимально возможной детализацией.</li>
</ul>
<p><strong>С нашей точки зрения, аудит должен ограничиваться ответами на такие вопросы, как:</strong></p>
<ul>
<li>Откуда был извлечен этот конкретный набор данных?</li>
<li>Когда данные были извлечены?</li>
<li>Какой процесс отвечал за извлечение данных?</li>
<li>Где эти данные использовались?</li>
</ul>
<p>Хранилище данных не должно отвечать на вопрос о том, как данные были получены операционной системой — на этот вопрос обычно может ответить только сама система-источник. В некоторых случаях хранилище данных получает информацию о пользователе и времени создания или изменения записи. Если такая информация доступна, мы храним ее только для справочных целей.</p>
<p>Для поддержки аудита в хранилище данных добавляется метаинформация, которая отслеживает источник данных и дату/время загрузки. Однако ответить на вопрос о том, где именно использовались данные, сложнее, так как витрины данных (data marts) часто агрегируют данные для бизнес-пользователей.</p>
<p>Чтобы упростить аудит, процессы хранилища данных должны быть простыми и понятными.</p>
<h3><strong>Затраты</strong></h3>
<p>Еще одной проблемой в хранилищах данных является снижение затрат, так как ИТ в целом рассматривается руководством как фактор затрат. Стоимость хранилища данных определяется множеством факторов, начиная от стоимости хранения и заканчивая ценой низкого качества данных и плохого планирования. Дополнительным фактором затрат является изменение бизнес-требований, которое требует адаптации хранилища данных.</p>
<p>Стоимость хранения — это часто недооцениваемый фактор затрат в хранилищах данных. В начале проекта затраты обычно невысоки. Если хранилище данных создавалось как теневой ИТ-проект (то есть инициировалось бизнес-подразделением, реализовывалось внешними ИТ-консультантами и обходило внутреннюю ИТ-службу), то его расходы могли даже быть скрыты в бюджете другого проекта или активности.</p>
<p>Однако по мере роста объема данных затраты на хранение увеличиваются. В некоторых случаях это происходит экспоненциально и включает не только покупку новых дисков. <strong>Если в хранилище данных добавляется больше данных, то:</strong></p>
<ul>
<li>Требуется более быстрый доступ к сети для работы с данными,</li>
<li>Нужны более мощные вычислительные ресурсы для их обработки,</li>
<li>Требуются лучшие и более дорогие контроллеры жестких дисков.</li>
</ul>
<h4><strong>Основные факторы затрат</strong></h4>
<p>Хотя растущие затраты на хранение — важный аспект, они не являются главным фактором расходов в хранилищах данных.</p>
<p><strong>Основные затраты включают:</strong></p>
<ul>
<li>Стоимость хранения</li>
<li>Стоимость низкого качества данных</li>
<li>Стоимость плохого планирования</li>
<li>Стоимость изменений бизнес-требований (см. следующий раздел)</li>
</ul>
<p>Наибольшее влияние оказывают затраты на низкое качество данных и плохое планирование. Даже если команда проекта тщательно спланировала хранилище данных и обеспечила его качество, изменение бизнес-требований все равно может привести к значительным затратам. Единственный способ минимизировать их — продуманное упреждающее планирование.</p>
<p>Это особенно актуально, когда бизнес-требования формируются &#171;выше по потоку&#187; хранилища данных. Как было сказано ранее, это не только снижает производительность, но и увеличивает стоимость обслуживания.</p>
<h4><strong>Снижение затрат за счет гибкости</strong></h4>
<p>Бизнес-требования не должны быть встроены в процесс загрузки хранилища данных, их следует переносить на уровень загрузки витрин данных (data marts) — ближе к конечным пользователям.</p>
<p><strong>Это позволяет:</strong></p>
<ul>
<li>Обеспечить гибкость команды,</li>
<li>Контролировать затраты на поддержку и разработку (за счет авто-генерации),</li>
<li>Быстрее реагировать на изменения бизнес-требований,</li>
<li>Снизить стоимость производства витрин данных.</li>
</ul>
<p>Гибкость команды прямо пропорциональна сложности обработки данных. Если разделить сложные бизнес-требования на отдельные компоненты, можно упростить различные секции загрузки архитектуры. В результате значительная часть реализации может быть автоматически сгенерирована, что повышает оперативность реакции на изменения бизнес-требований.</p>
<h3><strong>Другие бизнес-требования</strong></h3>
<p>Современная деловая среда характеризуется быстро меняющимися условиями и неопределенностью. Поэтому изменения бизнес-требований происходят довольно часто.</p>
<p>Разработчики хранилищ данных стараются избежать частых изменений за счет тщательного планирования и заблаговременного проектирования. Этот подход часто основывается на традиционных каскадных методах разработки программного обеспечения.</p>
<p><strong>В таких подходах обычно выделяют четыре фазы:</strong></p>
<ol>
<li>Определение требований к хранилищу данных.</li>
<li>Архитектурное планирование и проектирование хранилища данных.</li>
<li>Разработка хранилища данных.</li>
<li>Тестирование хранилища данных.</li>
</ol>
<p>В отличие от этого, гибкие методы разработки ПО созданы для повышения качества программного обеспечения путем использования обратной связи от клиентов для поиска наилучших решений. Чтобы соответствовать этим требованиям, хранилище данных должно быть адаптивным и устойчивым к изменениям.</p>
<p>Изменения в существующих структурах не должны делать недействительными уже хранящиеся данные или используемые приложения. Одним из главных преимуществ гибких методов является способность быстро реагировать на изменения в бизнесе. Более подробно этот вопрос рассматривается в главе 3 — Методология Data Vault 2.0.</p>
<h4><strong>Инструменты для работы с данными</strong></h4>
<p>Чтобы поддерживать как инженеров хранилищ данных, так и бизнес-пользователей, необходим набор инструментов для запросов, анализа и представления информации. К таким инструментам относятся:</p>
<ul>
<li>Системы отчетности,</li>
<li>Анализаторы запросов,</li>
<li>OLAP-браузеры (онлайн-аналитическая обработка),</li>
<li>Инструменты для анализа данных (data mining) и другие.</li>
</ul>
<p>Примером является Microsoft SQL Server 2014, который содержит эти инструменты &#171;из коробки&#187;.</p>
<h4><strong>Сохранение знаний в команде</strong></h4>
<p>Еще одним важным бизнес-требованием является способность проектной команды адаптироваться к естественной текучести кадров. Важный фактор успеха в области хранилищ данных — сохранение знаний и навыков команды, независимо от ухода ключевых сотрудников.</p>
<p><strong>Решения для этого включают:</strong></p>
<ul>
<li>Хорошо документированную систему хранилища данных,</li>
<li>Легко понятный дизайн,</li>
<li>Использование BI-решений (бизнес-аналитики) от крупных вендоров.</li>
</ul>
<p>Например, решения Microsoft широко известны в отрасли и поддерживаются другими вендорами и консалтинговыми компаниями.</p>
<h4><strong>Роль Data Vault 2.0</strong></h4>
<p>Все вышеперечисленное является основными компонентами Data Vault 2.0 и его инноваций.</p>
<p>DV2.0 охватывает Big Data, NoSQL, производительность, гибкость команд, сложность и множество других вопросов. Он определяет стандарты и передовые практики для моделирования, реализации, методологии и архитектуры хранилищ данных.</p>
<h2>Введение в Data Vault 2.0</h2>
<p>Data Vault представляет собой систему бизнес-аналитики. Полное название системы Data Vault — Common Foundational Warehouse Architecture. Эта система включает в себя различные аспекты, связанные с проектированием, реализацией и управлением хранилищем данных.</p>
<p>Исторический анализ Data Vault 1.0 показывает, что первая версия была сильно сосредоточена на моделировании (Data Vault Modeling), то есть физических и логических моделях, формирующих сырой корпоративный склад данных.</p>
<p>Data Vault 2.0, в отличие от предыдущей версии, расширился и теперь включает в себя все необходимые компоненты, обеспечивающие успешную работу хранилищ данных и систем бизнес-аналитики.</p>
<p><strong>Эти компоненты:</strong></p>
<ul>
<li><strong>Data Vault 2.0 Modeling</strong> – Изменения модели для повышения производительности и масштабируемости.</li>
<li><strong>Data Vault 2.0 Methodology</strong> – Использование лучших практик Scrum и Agile.</li>
<li><strong>Data Vault 2.0 Architecture</strong> – Интеграция с NoSQL и Big Data-системами.</li>
<li><strong>Data Vault 2.0 Implementation</strong> – Автоматизация на основе шаблонов, генерация на уровне CMMI 5.</li>
</ul>
<p>Каждый из этих компонентов играет ключевую роль в общем успехе проекта корпоративного хранилища данных. Они сочетаются с известными в отрасли и проверенными временем методами, включая CMMI (Capability Maturity Model Integration), Six Sigma, TQM (Total Quality Management) и PMP (Project Management Professional).</p>
<h4><strong>Основные особенности Data Vault 2.0</strong></h4>
<ul>
<li><strong>Data Vault 2.0 Modeling</strong> теперь включает изменения, позволяющие моделям беспрепятственно работать с NoSQL и Big Data-системами.</li>
<li><strong>Data Vault 2.0 Methodology</strong> ориентирована на 2-3-недельные спринты с адаптациями и оптимизациями для повторяющихся задач хранилища данных.</li>
<li><strong>Data Vault 2.0 Architecture</strong> включает NoSQL, потоковую обработку данных в реальном времени и Big Data-системы, работающие с неструктурированными данными.</li>
<li><strong>Data Vault 2.0 Implementation</strong> делает акцент на автоматизацию и шаблонные методы для экономии времени, сокращения ошибок и повышения производительности команды, работающей с хранилищем данных.</li>
</ul>
<h2>Архитектура хранилища данных</h2>
<p>Чтобы удовлетворить технические ожидания, инженеры хранилищ данных могут использовать различные архитектурные подходы для построения хранилищ данных.</p>
<p>Обычно архитектуры хранилищ данных основаны на многоуровневых подходах, что характерно для информационных систем.</p>
<p>Две типичные архитектуры таких хранилищ будут описаны в следующих разделах.</p>
<h3>Типичная двухслойная архитектура</h3>
<p>Кимбалл представил широко используемую двухслойную архитектуру.</p>
<p>В этой архитектуре, представленной на Рисунке 1.3, есть только два уровня, которые являются частью самой системы хранилища данных.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-1138 size-full" src="https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle.jpeg" alt="" width="922" height="459" srcset="https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle.jpeg 922w, https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle-300x149.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle-768x382.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle-450x224.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/02/1_3_The_Kimball_Data_Lifecycle-780x388.jpeg 780w" sizes="(max-width: 922px) 100vw, 922px" /></a></p>
<h4><strong>Этап загрузки данных</strong></h4>
<p>Сырые данные из источников загружаются в промежуточную (stage) область.<br />Цель этого этапа — создать точную копию всех данных, которые должны быть загружены в хранилище данных.</p>
<p><strong>Основное назначение промежуточной области:</strong></p>
<ul>
<li>Сократить количество операций на исходной системе.</li>
<li>Уменьшить время извлечения данных из исходной системы.</li>
<li>Таблицы в промежуточной области строятся по образцу таблиц в исходной системе.</li>
</ul>
<p><strong>Промежуточная область необходима в случаях, когда:</strong></p>
<ul>
<li>Трансформации сложны и не могут выполняться на лету.</li>
<li>Данные поступают из нескольких источников в разное время.</li>
</ul>
<h4><strong>Этап загрузки в хранилище данных</strong></h4>
<p>После загрузки в stage, Кимбалл предлагает перемещение данных в хранилище.<br />Это хранилище данных построено на основе размерной модели и состоит из витрин данных (data marts), представляющих бизнес-процессы.</p>
<p>Эти витрины объединяются с помощью конформных измерений (conformed dimensions).<br />Такой подход был впервые предложен Кимбаллом в 1996 году.</p>
<h4><strong>Размерная модель Dimensional Modeling</strong></h4>
<p>Размерная модель — это де-факто стандарт, который прост в использовании для бизнес-пользователей и аналитических инструментов, таких как OLAP.</p>
<p>Поскольку размерная модель представляет собой логическое объединение конформных витрин данных, правила обработки данных должны быть реализованы до загрузки в хранилище, чтобы выравнивать и согласовывать наборы данных.</p>
<p>Мы обсудим размерное моделирование в главе 7 – Dimensional Modeling.</p>
<p>Приложения для доступа к данным используют размерную модель, чтобы:</p>
<ul>
<li>Предоставлять пользователям информацию.</li>
<li>Позволять проводить гибкий (ad-hoc) анализ.</li>
</ul>
<p>Преимущества и недостатки двухслойной архитектуры</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Преимущество:</strong> Проще построить размерное хранилище на основе исходных данных по сравнению с другими архитектурами.</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Недостаток: </strong>Сложнее создать вторую размерную модель из тех же исходных данных, так как данные придется загружать заново из промежуточной области.</p>
<p>Невозможно повторно использовать существующие ETL-пакеты.</p>
<h3>Типичная трехслойная архитектура</h3>
<p>Чтобы преодолеть ограничения двухслойной архитектуры, широко используется трехслойная архитектура.</p>
<p><strong>Рисунок 1.4 Хранилище данных Инмона</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-1139 size-full" src="https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse.jpeg" alt="" width="919" height="446" srcset="https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse.jpeg 919w, https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse-300x146.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse-768x373.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse-450x218.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/02/1_4_The_Inmon_Data_Warehouse-780x379.jpeg 780w" sizes="(max-width: 919px) 100vw, 919px" /></a><br />Эта архитектура была представлена Инмоном и включает атомарное хранилище данных,<br />которое часто реализуется в виде нормализованного операционного хранилища данных (ODS).<br />ODS располагается между промежуточной областью (staging area) и размерной моделью.</p>
<h4><strong>Описание слоев трехслойной архитектуры</strong></h4>
<p><strong>Промежуточная область (Stage Area)</strong></p>
<ul>
<li>Работает так же, как в двухслойной архитектуре.</li>
<li>Служит для извлечения данных из источников перед загрузкой в хранилище.</li>
</ul>
<p><strong>Хранилище данных (Data Warehouse / ODS)</strong></p>
<ul>
<li>Содержит сырые данные.</li>
<li>Моделируется в третьей нормальной форме (3NF).</li>
<li>Интегрирует все данные предприятия, но при этом сохраняет физические таблицы исходных систем.</li>
<li>Функционирует аналогично большой операционной базе данных.</li>
</ul>
<p><strong>Размерная модель (Dimensional Model / Data Marts)</strong></p>
<ul>
<li>Основана на нормализованных бизнес-данных.</li>
<li>Бизнес-пользователи могут анализировать данные через предметно-ориентированные витрины данных (data marts).</li>
<li>Похожая схема использовалась в двухслойной архитектуре.</li>
</ul>
<h4><strong>Преимущества трехслойной архитектуры</strong></h4>
<ul>
<li>Упрощенное создание новых витрин данных
<ul>
<li>В отличие от двухслойной архитектуры, данные уже очищены и интегрированы в ODS.</li>
<li>Нет необходимости в дополнительной обработке данных при создании новых витрин.</li>
</ul>
</li>
<li>Гибкость в предоставлении данных
<ul>
<li>В двухслойной архитектуре витрин данных может быть несколько, чтобы удовлетворить различные группы пользователей.</li>
<li>В трехслойной архитектуре процесс построения новых витрин значительно упрощен.</li>
</ul>
</li>
</ul>
<h4><strong>Недостатки трехслойной архитектуры</strong></h4>
<ul>
<li>Усложнение построения хранилища данных. Требуется больше ресурсов и времени на обработку данных.</li>
<li>Проблемы с изменением модели данных. Если многие витрины данных зависят от операционного хранилища (ODS), изменение модели данных может создать дополнительные сложности.</li>
</ul>
<p>В следующей главе мы рассмотрим альтернативную трехслойную архитектуру,<br />которая позволяет быстрее вносить изменения в хранилище данных.</p>


<p class="wp-block-paragraph"></p>
<p>Сообщение <a href="https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/">Перевод 1 Главы &#8212; Введение в хранилища данных</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datatalks.ru/data-vault-2-0-chapter-1-introduction-to-data-warehousing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
