1

我们的一个数据源每天发送一个包含数据汇总的提要。定期快照。例如:

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)
)

第二个解决方案添加了一个额外的中心,它只存储日期列表和日期和商店之间的交集链接。

第二种解决方案感觉更干净,但需要更多连接。

哪个是正确的模型?有没有更好的解决方案?

4

1 回答 1

2

就我对 Data Vault 建模方法的理解而言,Satellite 用于存储数据仓库的准确时间片。这意味着,如果给我一个特定日期并且我选择所有集线器、链接(没有或 enddate <=特定日期)。然后他们对应的条目与 max(loaddate) & loaddate <= specific date,我应该有当前现实世界数据状态的完整表示。

应用于您的问题,这意味着您的第二个解决方案符合这些要求。因为您仍然可以将源系统中的“更改”作为新的时间片导入,因此在 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 导入此数据。1 月 4 日 12:10:00 虽然“janes couts”销售团队将数字更正为只有 90 次销售。在您的第一个解决方案中,这会让您使用集线器键“janes coats”和加载日期“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”的业务密钥“janes coats”),加载日期为“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。

我认为它是Data Vault 模型中唯一允许的更新操作是在链接表中设置 EndDate 并且永远不允许删除。您有完整的 DWH 历史可用且可复制。

于 2019-04-01T12:02:07.670 回答