Моделирование периодического снимка в хранилище данных?

#data-vault

#хранилище данных

Вопрос:

Один из наших источников данных отправляет канал с совокупностью данных в день. Периодический снимок. Например:

 shop,       day,        sales
bobs socks, 2019-01-01, 45,
bobs socks, 2019-01-02, 50,
bobs socks, 2019-01-03, 10,
janes coats,2019-01-01, 500,
janes coats,2019-01-02, 55,
janes coats,2019-01-03, 100
  

Я знаю два способа смоделировать это в необработанном хранилище хранилища данных:

Многоактивный спутник

Здесь мы разрешаем каждому сателлиту иметь несколько строк для каждого ключа концентратора.

 create table dbo.HubShop (
    ShopName nvarchar(50) not null,
    primary key pk_HubShop (ShopName)
)

create table dbo.SatDailyShopSales (
    ShopName nvarchar(50) not null,
    SalesDate date not null,
    SalesAmount money not null,
    LoadTimestamp datetime2(7) not null,

    primary key pk_SatDailyShopSales (ShopName, SalesDate, LoadTimestamp)
)
  

Это легко реализовать, но теперь у нас есть двухвременный элемент для спутника.

Центр моментальных снимков

 create table dbo.HubShop (
    ShopName nvarchar(50) not null,
    primary key pk_HubShop (ShopName)
)

create table dbo.HubSnapshot (
    SalesDate date not null,
    primary key pk_HubSnapshot  (SalesDate)
)

create table dbo.LinkDailyShopSnapshot (
    LinkDailyShopSnapshotHash binary(32) not null,
    ShopName nvarchar(50) not null,
    SalesDate date not null,

    primary key pk_LinkDailyShopSnapshot  (LinkDailyShopSnapshotHash)
)

create table dbo.SatDailyShopSales (
    LinkDailyShopSnapshotHash binary(32) not null,

    SalesAmount money not null,
    LoadTimestamp datetime2(7) not null,

    primary key pk_SatDailyShopSales (LinkDailyShopSnapshotHash, LoadTimestamp)
)
  

Это второе решение добавляет дополнительный концентратор, который просто хранит список дат и ссылку для пересечения между date и shop.

Второе решение кажется более чистым, но требует большего количества соединений.

Какая модель правильная? Есть ли какие-либо лучшие решения?

Комментарии:

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

Ответ №1:

насколько я понимаю подход к моделированию хранилища данных, спутники предназначены для хранения точных временных срезов вашего хранилища данных. Это означает, что если мне задана конкретная дата и я выбираю все узлы, ссылки (без или enddate <= конкретная дата). И затем их соответствующая запись с max (loaddate) amp; loaddate <= конкретная дата, у меня должно быть полное представление текущего состояния данных в реальном мире.

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

Чтобы сформулировать это в качестве примера, предположим, что ваша исходная система имеет состояние:

 shop,       day,        sales
bobs socks, 2019-01-01, 45,
bobs socks, 2019-01-02, 50,
bobs socks, 2019-01-03, 10,
janes coats,2019-01-01, 500,
janes coats,2019-01-02, 55,
janes coats,2019-01-03, 100
  

и вы импортируете эти данные в 2019-01-03 23:30:00.
4 января в 12: 10:00, хотя команда продаж «janes couts» исправляет цифры только до 90 продаж.
В вашем первом решении это приводит к обновлению записи satellite с помощью ключа концентратора «janes coats» и loaddate «2019-01-03» до 90, что приводит к потере точной истории dwh.

таким образом, ваш DWH впоследствии сохраняет только следующее:

 shop,       day,        sales
bobs socks, 2019-01-01, 45,
bobs socks, 2019-01-02, 50,
bobs socks, 2019-01-03, 10,
janes coats,2019-01-01, 500,
janes coats,2019-01-02, 55,
janes coats,2019-01-03, 90
  

тогда как в вашем втором решении вы просто вставляете новую временную шкалу для хэша моментального снимка хранилища (для бизнес-ключа «Джейнс коутс» с датой «2019-01-03») с датой загрузки «2019-01-03 12: 10:00» и продаж 90.

 LINK
shop,       day,        ID (think of ID as a hash)
bobs socks, 2019-01-01, 1
bobs socks, 2019-01-02, 2
bobs socks, 2019-01-03, 3
janes coats,2019-01-01, 4
janes coats,2019-01-02, 5
janes coats,2019-01-03, 6

SALES Satellite
Link ID, loaddate,            sales
1,       2019-01-03 23:30:00, 45
2,       2019-01-03 23:30:00, 50
3,       2019-01-03 23:30:00, 10
4,       2019-01-03 23:30:00, 500
5,       2019-01-03 23:30:00, 55
6,       2019-01-03 23:30:00, 100   !
6,       2019-01-04 12:10:00, 90    !
  

Таким образом, вы можете легко увидеть в своей системе, что вы получили корректировку показателей продаж в 2019-01-04 12: 10:00, а до этого их было 100.

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