我正在尝试了解维度模型和星型模式。假设我有一个销售事实表,记录零售商店的总销售额,其中有四个维度:日期、客户、商店和促销(如优惠券等促销活动)。(下面的伪模式)。
我真的很喜欢用星期几等属性预先填充“日期”维度的想法,这样您就可以通过看似复杂的条件(例如“过去 10 年第二季度的星期六”)轻松过滤事实。
现在,假设我希望促销维度具有 Start_Date 和 End_Date 属性,它们表示促销的开始和结束。我该怎么做呢?我想了想,得出了三个不太理想的解决方案:
1) 使 Start_Date 和 End_Date 成为常规的原子属性(ISO8601 字符串或数据库的日期时间对象),并且仅允许有限的过滤。
2) 将 Start_Date 和 End_Date 外键设置为 Date 表,打破星型模式,但允许与完整 Date 维度相同的过滤功能。
3) 包括 Start_Date_Day_of_Week、Start_Date_Quarter 等属性,维护星型模式,但增加维度大小,并在促销维度中复制日期维度的结构。
Sales Table
-----------
Date key (FK to Dates table)
Promotion key (FK to Promotions)
Customer key (FK to Customers table)
Store key (FK to Stores)
Sales Amount
Date Table
----------
Date Key (PK)
Month
Day of week
Day of month
Day of Quarter
Day of year
Holiday?
Quarter
Day since …Run Code Online (Sandbox Code Playgroud)