digital-garden/dev/database/Data Vault.md
Struchkov Mark d8d8e74b4a
All checks were successful
continuous-integration/drone/push Build is passing
Data Vault
2024-11-26 22:34:00 +03:00

79 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- Таблицы сателиты
tags:
- maturity/🌱
date: 2024-11-25
---
![[../../meta/files/images/Снимок экрана 2024-11-25 в 13.57.23.png]]
**Основные понятия:**
- **Хаб (Hub):**
Таблица, представляющая основную сущность или бизнес-объект, например, клиент, продукт или заказ. В хабе обычно содержатся стабильные и уникальные бизнес-идентификаторы.
- **Линк (Link):**
Таблица, представляющая связь между хабами. Она моделирует отношения, например, какой клиент сделал какой заказ.
- **Сателлит (Satellite):**
Таблица, привязанная к хабу или линку, которая хранит дополнительные атрибуты и временные данные.
**Зачем нужны сателлиты?**
- **Отделение изменяемых данных от неизменяемых:** Хаб содержит уникальные данные, которые редко изменяются. Все остальные данные, которые могут меняться (например, имя клиента, его адрес или статус заказа), переносятся в сателлиты.
- **Историзация данных:** Сателлиты поддерживают версионность, т.е. они хранят не только актуальное состояние данных, но и их историю. Это достигается за счет добавления колонок:
- Дата начала действия версии (`start_date`).
- Дата окончания действия версии (`end_date`).
- Индикатор актуальной версии (например, `is_current`).
- **Разделение областей данных:** Сателлиты позволяют разделить разные типы данных для более удобного хранения и обработки. Например:
- Один сателлит может хранить адресную информацию.
- Другой — контактные данные.
- Третий — финансовую информацию
- **Облегчение загрузки данных:** При использовании ETL (Extract, Transform, Load) сателлиты упрощают инкрементальную загрузку, так как можно обрабатывать только те записи, которые изменились.
- **Масштабируемость:** За счет хранения данных в разных таблицах (сателлитах), можно легче управлять растущим объемом данных и делать хранилище более модульным.
**Преимущества сателлитных таблиц:**
- **Поддержка аудита:** История изменений атрибутов сохраняется, что критично для аналитики и соблюдения нормативных требований.
- **Управление большими данными:** Разделение на хабы, линки и сателлиты делает модель гибкой и позволяет обрабатывать большие объемы данных с меньшими затратами.
- **Удобство для интеграции:** Модель легко расширяется за счет добавления новых сателлитов без изменения существующей структуры.
**Недостатки:**
- Увеличение количества таблиц и сложности структуры.
- Медленные запросы из-за множества JOIN-операций.
- Увеличение объема данных из-за историзации.
- Сложные и трудоемкие ETL/ELT процессы.
- Требуется опыт и квалификация для работы с моделью.
- Ограниченная поддержка в BI-инструментах.
- Модель может быть избыточной для небольших проектов.
## Пример
Предположим, у нас есть сущность "Клиент". В Data Vault модель она будет представлена следующим образом:
Хаб (Hub_Client):
```plaintext
client_id | business_key | load_date | record_source
```
Сателлит (Satellite_Client_Demographics):
```plaintext
client_id | name | birth_date | start_date | end_date | is_current | record_source
```
Сателлит (Satellite_Client_Address):
```plaintext
client_id | address | city | country | start_date | end_date | is_current | record_source
```
Здесь:
- **Hub_Client** хранит уникальный идентификатор клиента (например, ID из CRM).
- **Satellite_Client_Demographics** хранит демографические данные клиента, которые могут изменяться (например, имя при смене паспорта).
- **Satellite_Client_Address** хранит адресные данные клиента, включая исторические изменения адресов.
***
## Мета информация
**Область**::
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-25]]
**Автор**::
### Дополнительные материалы
- [Введение в Data Vault / Хабр](https://habr.com/ru/articles/348188/)
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->