缓慢变化的事实表?

Posted

技术标签:

【中文标题】缓慢变化的事实表?【英文标题】:Slowly Changing Fact Table? 【发布时间】:2009-08-21 18:01:02 【问题描述】:

背景) 我已经完成了为我们的库存数据构建事实表的过程,该表理论上将充当我们仓库的夜间快照。记录的是数量、重量、位置、状态等信息。数据非常细化,在许多情况下与单个实体没有具体关系(我们的源数据库将库存数据记录为具有三个主键:车牌又名托盘,产品和包装类型 - 所以它基本上有 3 个业务密钥,没有代理密钥)。

我们的目标是能够 100% 准确地再现我们仓库管理系统的数据,这些数据可以在历史上的任何一天查看。因此,我可以查看 8 月 4 日在 1234 号位置有多少托盘产品 XYZ。

问题 1) 现在,我已经构建了这个事实表,使其在结构上看起来像一个渐变维度,类型 2。这是错误的吗?我一直在阅读一些关于累积快照事实表的内容,并且我开始质疑我的设计。在这种情况下,最佳做法是什么?

问题 2) 如果我的设计没问题,我该如何配置分析服务,以便它识别 FACT 表中的 DateStart 和 DateEnd 列?我找到了一些关于如何为维度配置它的信息,但它似乎不适用于/适用于事实表。

供参考 - 我的事实表的结构(添加了关于列的注释):

CREATE TABLE [dbo].[FactInventory](     
[id] [int] IDENTITY(1,1) NOT NULL,  (fact table only surrogate key)
[DateStart] [datetime] NULL,    (record begin date)
[DateEnd] [datetime] NULL,       (record end date)
[CreateDate] [datetime] NULL,    (create date of the inventory record in src db)
[CreateDateId] [int] NULL,       (create date dimension key)
[CreateTimeId] [int] NULL,       (create time dimension key)
[LicensePlateId] [int] NULL,     (pallet id dimension key)
[SerialNumberId] [int] NULL,     (serial number id dimension key)
[PackagedId] [int] NULL,         (packaging type id dimension key)
[LotId] [int] NULL,          (inventory lot id dimension key)
[MaterialId] [int] NULL,         (product id dimension key)
[ProjectId] [int] NULL,          (customer project id dimension key)
[OwnerId] [int] NULL,        (customer id dimension key)
[WarehouseId] [int] NULL,     (warehouse id dimension key)
[LocationId] [int] NULL,      (location id dimension key)
[LPStatusId] [int] NULL,      (licenseplate status id dimension key)
[LPTypeId] [int] NULL,    (licenseplate type id dimension key)
[LPLookupCode] [nvarchar](128) NULL, (licenseplate non-system name)
[PackagedAmount] [money] NULL,  (inventory amount - measure)
[netWeight] [money] NULL,   (inventory netWeight - measure)
[grossWeight] [money] NULL, (inventory grossWeight - measure)
[Archived] [bit] NULL,  (inventory archived yes/no - dimension)
[SCDChangeReason] [nvarchar](128) NULL (auditing data for changes)

【问题讨论】:

【参考方案1】:

通常,在快照事实表中您没有更改。

您通常有一个用于测量粒度的日期/时间维度,而不是 DateStart/DateEnd。同样,您没有任何 SCD 信息。拍摄事实快照并将日期和时间维度附加到这些事实。如果这些事实每个月都一样重复,那就这样吧。

处理确定在给定时间有效的事实比您真正希望您的 DW 或 ETL 处理的处理更多 - 这种设计(生效日期等)更有效地用于实时 OLTP 类型的系统完整的历史记录保存在实时系统中。 DW 的重点是针对报告进行优化,而不是针对空间进行优化,因此有一个直接快照日期/时间维度,可让您轻松索引数据并可能对数据进行分区,而无需进行大量日期算术或比较。

就您的维度模型而言,请注意不要屈服于维度过多的问题。请记住,维度不必与现实世界中的实体相对应。维度属性如何分组到维度表中的选择应该由 1) 查询需求、2) 数据亲和性和更改行为、3) 业务组织来决定。您可能想考虑使用一个或多个垃圾维度。

【讨论】:

【参考方案2】:

在继续之前,库存真的是一个缓慢变化的事实吗?

编辑:那么为什么不每天对每个产品进行快照,因为这正是你想要的。

问题是事实表变得很大,并且您将所有东西都不必要地投入到事实表中。理想情况下,事实表将只包含维度的外键和仅与手头事实相关的数据。但是您概述的某些列看起来像是属于其中一个维度表,而

例如,车牌信息。状态、类型和查找代码。 netWeight/grossWeight 也是如此。它们应该可以从产品维度和 PackagedAmount 推导出来。

CREATE TABLE [dbo].[FactInventory](     
[id] [int] IDENTITY(1,1) NOT NULL,  (fact table only surrogate key)
[day] [int] NULL,                (day dimension key, grain of a day)
[CreateDateId] [int] NULL,       (create date dimension key)
/* I take these are needed?
 * [CreateTimeId] [int] NULL,       (create time dimension key)
 * [CreateDate] [datetime] NULL,    (create date of the inventory record in src db)
 */
[LicensePlateId] [int] NULL,     (pallet id dimension key)
/* Now THESE dimension columns...possibly slowly changing dimensions?
[LPStatusId] [int] NULL,             (licenseplate status id dimension key)
[LPTypeId] [int] NULL,               (licenseplate type id dimension key)
[LPLookupCode] [nvarchar](128) NULL, (licenseplate non-system name)
*/
[SerialNumberId] [int] NULL,     (serial number id dimension key)
[PackagedId] [int] NULL,         (packaging type id dimension key)
[LotId] [int] NULL,              (inventory lot id dimension key)
[MaterialId] [int] NULL,         (product id dimension key)
[ProjectId] [int] NULL,          (customer project id dimension key)
[OwnerId] [int] NULL,            (customer id dimension key)
[WarehouseId] [int] NULL,        (warehouse id dimension key)
[LocationId] [int] NULL,         (location id dimension key)
[PackagedAmount] [money] NULL,   (inventory amount - measure)
[netWeight] [money] NULL,        (inventory netWeight - measure)
[grossWeight] [money] NULL,      (inventory grossWeight - measure)
[Archived] [bit] NULL,           (inventory archived yes/no - dimension)
[SCDChangeReason] [nvarchar](128) NULL (auditing data for changes)

【讨论】:

我想你可以说这是一个快速变化的事实,但我想至少每天一次捕捉所有这些细节的“快照”。

以上是关于缓慢变化的事实表?的主要内容,如果未能解决你的问题,请参考以下文章

SCD缓慢变化维拉链表

HIVE- SCD缓慢变化

聊聊数据仓库中的缓慢变化维度(SCD)

12.缓慢变化维处理技术

大数据学习(三十一)数据仓库如何处理缓慢变化维

作为事实表的可编辑数据