我们的一个数据源发送一个包含每天数据聚合的源。定期快照。例如:
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建模方法的理解而言,卫星可以存储数据仓库的准确时间片。 这意味着,如果给我一个特定的日期,我选择所有集线器、链接(没有或结束日期<=特定日期)。然后他们对应的条目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,尽管"简斯库特"销售团队将数字更正为只有90个销售。 在您的第一个解决方案中,这让您使用集线器键"简外套"和加载日期"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"的业务密钥"Janescoats"),加载日期为"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 历史记录可用且可重现。