事实表推荐

时间:2014-01-27 22:03:29

标签: sql data-warehouse

我有一个数据集市,只需要捕获产品的序列号,活动的日期以及活动发生的位置(哪个帐户)。

有五种可能的活动。我遇到的问题是这个。其中两项活动在仓库层面进行。其余三个在帐户级别进行(WH不适用)。但最终每个仓库都会汇总到一个主帐户。

所以,如果我有一个事实表,我基本上需要两个FK,你必须遍历事实表来构建WH>帐户层次结构似乎难以维护。我想要一个维度表。

或者它是否建议我将其拆分为两个事实表,即使这两个表的唯一不同特征是活动是否发生在仓库。

报告的目标是在帐户级别,但拥有WH信息可能在某些时候有用。我需要检查重复项等,这就是为什么我倾向于第一个,但不知道如何正确处理层次结构。

单一事实表设计

  • 项目:1
  • 帐号:14
  • 仓库:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber:123456
  • 计数:1

双重事实表设计

表1

  • 项目:1
  • 仓库:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber:123456
  • 计数:1

表2

  • 项目:1
  • 帐号:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber:123456
  • 计数:1

2 个答案:

答案 0 :(得分:3)

我把你的情况解释为:

  • 所有活动都需要帐户
  • 有些活动涉及到 仓库。
  • 仓库的选择意味着一个帐户。该 上述两点中提到的帐户属于同一类型(那里 只有一个帐户维度表)

在这种情况下,您应该使用单个FACT表设计:

[ACTIVITY_FACT]
SK                    (Optional, i find unique surrogate PKs useful)
ITEM_SK               (Link to your ITEM_DIM table)
ACCOUNT_SK            (Link to your ACCOUNT_DIM table)
WAREHOUSE_SK          (Link to your WAREHOUSE_DIM table, -1 for no warehouse activities)
ACTIVITY_TYPE_SK      (Link to your ACTIVITY_TYPE_DIM table) 
ACTIVITY_DATE_SK      (Link to your DATE_DIM table)
ITEM_SERIAL_NUMBER
ITEM_COUNT

在您的WAREHOUSE维度中记录NONE或NOT APPLICABLE并为其分配一个很好的明显特殊条件SK值-1或-9或任何您的商店用于此类事物。

对于引用仓库的活动记录,请放置相应的仓库sk和属于该仓库的帐户sk。

对于不涉及仓库的活动,使用NONE / NOT APPLICABLE仓库维度记录和相应的帐户SK填充仓库sk。

现在,您的事实表可以加入到您的帐户和仓库维度表中,而无需担心外部联接或空条件处理。这应该允许您和您的用户根据需要使用仓库维度数据,而不必管理两个基本上包含相同日期的表格。

答案 1 :(得分:1)

可能性是在单个维度表中定义层次结构。猜测你正在处理什么,我想出了以下内容。

维度表概述:

TABLE: Account

Account_ID  <surrogate key>
Account     <Account name, identifier>
Warehouse   (Warehouse name, identifier)

示例数据:

Account_ID   Account   Warehouse
    1           A        n/a
    2           B        n/a
    3           C        n/a
    4           W        wh1
    5           W        wh2
    6           Z        wh3
    7           Z        n/a

Account_ID只是一个代理键,没有内在含义或价值

帐户会列出帐户。在这里,我显示了五个,A,B,C,W和Z.选择不同以获取帐户列表;通过Account_ID加入事实表,其中Account =“W”获取该帐户的所有数据(对于许多仓库,如果适用)。

仓库列出所有仓库及其关联的帐户;这里,“W”是两个独立仓库(wh1,wh2)的账户; Z与仓库wh3相关联,但也可以由具有“否”仓库的事实表使用。通过Account_ID加入事实表,其中Warehouse =“wh1”获取该仓库的所有数据。

使用此功能,通过事实表中的Account_ID,您可以深入查看任何给定帐户或特定仓库的所有条目(如果有值,则可以没有仓库)。

这种方法有很多变化和排列。