我把你的情况解释为:
在这种情况下,您应该可以使用单个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。
现在,您的事实表可以加入到您的帐户和仓库维度表中,而不必担心外部联接或空条件处理。这应该允许您和您的用户根据需要使用仓库维度数据,而不必管理两个基本上包含相同日期的表格。
可能性是在单个维度表中定义层次结构。猜测你正在处理什么,我想出了以下内容。
维度表概述:
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相关联,但也可以由具有 no 仓库的事实表使用。通过Account_ID加入事实表,其中Warehouse = wh1 获取该仓库的所有数据。
使用此功能,通过事实表中的Account_ID,您可以深入查看任何给定帐户或特定仓库(或没有仓库,如果有值)的所有条目。
这种方法有很多变化和排列可能。