【问题标题】:Modeling a periodic snapshot in data vault?在数据仓库中建模定期快照?
【发布时间】:2019-03-25 19:50:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不是第二种解决方案。 Data Vault 是关于业务密钥的,Snapshot 不是其中之一,它只是如何捕获集线器之间的关系。

标签: data-vault


【解决方案1】:

就我对 Data Vault 建模方法的理解而言,Satellite 用于存储数据仓库的准确时间片。 这意味着如果给我一个特定日期并且我选择所有集线器、链接(没有或结束日期特定日期)。然后他们对应的条目与 max(loaddate) & 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 导入此数据。 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。

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

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 2020-07-19
    • 2021-02-02
    • 2023-03-30
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多