我有一个数据集市,只需要捕获产品的序列号,活动的日期以及活动发生的位置(哪个帐户)。
有五种可能的活动。我遇到的问题是这个。其中两项活动在仓库层面进行。其余三个在帐户级别进行(WH不适用)。但最终每个仓库都会汇总到一个主帐户。
所以,如果我有一个事实表,我基本上需要两个FK,你必须遍历事实表来构建WH>帐户层次结构似乎难以维护。我想要一个维度表。
或者它是否建议我将其拆分为两个事实表,即使这两个表的唯一不同特征是活动是否发生在仓库。
报告的目标是在帐户级别,但拥有WH信息可能在某些时候有用。我需要检查重复项等,这就是为什么我倾向于第一个,但不知道如何正确处理层次结构。
单一事实表设计
双重事实表设计
表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,您可以深入查看任何给定帐户或特定仓库的所有条目(如果有值,则可以没有仓库)。
这种方法有很多变化和排列。