数据仓库中的交叉引用事实和维度

时间:2011-04-29 01:42:18

标签: ssas data-warehouse business-intelligence

我正在尝试为许可供应商设计数据仓库,该供应商在电子商务和其他各种场所销售许可证。他们想要跟踪的事情是销售,产品生命周期和活动。这意味着有不同的销售类型(例如新购买,促销购买,续订)和许可证的不同事件/状态,例如 - 许可证可以安装,更新,激活,注册。许可证可以多次续订(在不同的日期)。

所以我认为我的维度非常简单 - 日期,产品,来源,销售类型和事件/状态。我会有两个事实表;一个用于销售,另一个用于事件,它们都具有维度表的外键。我的事实表将是一个累积的事实表,其中每个事件都会添加一个新行 - 因此,许可证可以重复。但是,要求规定他们能够交叉引用这两个事实以及销售类型和事件维度。例如,如果某人看到“A”在“新购买”类型的美国电子商务商店中有100个销售,那么他们希望看到有多少'那些'100个许可证也被激活......然后他们可能会希望看到,激活的人,有多少人注册了......然后(回到saletype)注册了多少人,其中有多少人“更新了”。我无法真正定义一个层面,因为你可以有很多这些组合......

我该怎么做?正如我正在阅读的那样,我发现似乎没有办法根据许可证本身(这是我需要做的)将这两个事实联系起来。

另外,我也在想,也许我可以拥有1个事实表,并且我可以“技术上”将saletype和eventtype组合成一个大型事件类型维度。所以,然后在事实表中将是一个大事务事实表,它将具有事件维度的偶数外键。但是,所以现在我有一个事实表,每个事件都有一行发生在许可证上。许可证会重复出现,并且一个事件可以多次出现(在不同的日期)。因此,如果我选择查看某个事件的总数,我怎么能看到其他事件中还存在多少个许可证呢?

我需要提供所有这些数字作为度量,以便业务用户可以即时查看它们(使用他们想要使用的任何OLAP浏览器)

注意:我使用的是SQL Server分析服务和SQL Server 2008 r2

作为参考,这就是我现在所拥有的:

  1. DimProducts(PK:ProductID和其他属性)
  2. DimDate(PK:DateKey和其他属性)
  3. DimEvent(PK:EventID和其他属性)

  4. FactLicenses(FK:ProductID; FK:DateKey; FK:EventID和许可证字段(varchar))

  5. 所以我重复了许可证,每次发生许可证时都会发生一个事件(安装,激活,续订,取消,续订(再次)。可能有一个许可证具有相同的eventID,但从未在相同的DateKey。表的主键是DateKey + EventID + License

    编辑:

    所以,我在很多地方都读过这样的情况下的事实表应该是一个累积的事实表,它有多个指向同一(类型)维度的列 - (即日期),我应该为每一个创建角色扮演维度。但是,您如何解释许可证可以多次续订,并且可以多次安装等事实......?

3 个答案:

答案 0 :(得分:1)

我已经回到Ralph Kimball的书中,并找到了一个可以为我解决这个问题的案例研究。我还将销售类型和事件类型合并为一个主要组。所以,鉴于此,仍然有两组事情 - 一次可能发生在许可证上的事情,以及可能多次发生在许可证上的事情。许可证可能发生的一切现在存储在累积事实表中。然后,多次发生在licene上的所有事物都存储在不同的表中(每个实体的不同表或可能发生的事件的“类型”)。

这有效地解决了我的问题,因为在分析服务中,我现在能够创建一种称为“引用”的关系,其中关系是“许可”。因此,我可以通过原始累积事实表(具有许可证列)链接与不同表相关的任何维度。

感谢您的投入,无论谁试图回答。

答案 1 :(得分:0)

我认为您的设计已经适应了这种类型的分析,但实际上您的情况包含两个查询。

首先,如果您想通过将产品“A”和“美国”来源的SALES事实表中的值相加来找出销售数量和价值。例如:

SELECT COUNT(*) TOTAL_UNIT_SALES, SUM(FCT_SALES.VALUE) TOTAL_VALUE
FROM   FCT_SALES, DIM_PRODUCTS, DIM_SOURCES
WHERE  FCT_SALES.PRODUCT_FK = DIM_PRODUCTS.PRODUCT_SK
AND    DIM_PRODUCTS.NAME = 'A'
AND    FCT_SALES.SOURCE_FK = DIM_SOURCES.SOURCE_SK
AND    DIM_SOURCES.NAME = 'USA';

第二个会在EVENTS事实表中对同一组维度外键的记录进行透视或求和,以查找每种类型发生了多少事件。例如:

SELECT SUM(CASE WHEN DIM_SALE_TYPES.NAME = 'NEW' THEN 1 ELSE 0 END) TOTAL_NEW_SALES
,      SUM(CASE WHEN DIM_SALE_TYPES.NAME = 'ACTIVATION' THEN 1 ELSE 0 END) TOTAL_ACTIVATIONS
,      SUM(CASE WHEN DIM_SALE_TYPES.NAME = 'REGISTRATION' THEN 1 ELSE 0 END) TOTAL_REGISTRATIONS
FROM   FCT_EVENTS, DIM_PRODUCTS, DIM_SOURCES, DIM_SALE_TYPES
WHERE  FCT_EVENTS.PRODUCT_FK = DIM_PRODUCTS.PRODUCT_SK
AND    DIM_PRODUCTS.NAME = 'A'
AND    FCT_EVENTS.SOURCE_FK = DIM_SOURCES.SOURCE_SK
AND    DIM_SOURCES.NAME = 'USA'
AND    FCT_EVENTS.SALE_TYPE_FK = DIM_SALE_TYPES.SALE_TYPE_SK;

答案 2 :(得分:0)

我强烈建议将许可证添加为单独的维度。它是否可以与某些唯一标识符相关联,例如许可证号或激活密钥?