如何对从实体关系到维度模型的日期进行分类

How to classify dates going from Entity-Relationship to Dimensional model

我的问题可能很简单,但我查阅了相当多的资源但仍然卡住了。

在我的 ER 模型(订单、发货、呼叫中心流程)中,我有几个包含各种日期字段的实体,例如:呼叫日期、订单日期、付款日期、发货日期。因此,在我制作维度模型时,我确实创建了一个时间维度,其中包含年、月、日等层次结构。然而,我经常在我的事实 table 中得到一个日期字段。 假设我的事实 table 是 Deliveries,我是否可以简单地从该 ER 实体中获取 DeliveryDate 字段并将其放在我的维度模型中的单独时间维度中?

这是一个纯粹的理论练习,任何帮助,对文章的 copy/paste 或 link 之类的东西都会有所帮助!谢谢!

编辑

我想简单地提供一下这个问题的上下文,这肯定也会澄清它。本质上,我有一个家庭作业项目,在这种情况下,一家公司有一个事务性 ER 模型(用于他们的日常运营活动),而管理层希望创建一个 BI 模型,使他们能够提取 KPI,这也是我的目标. (即我需要从实体关系图中创建几个星型图)

如上所述,有 3 个主要业务流程:呼叫中心、销售和运输部门。所有这些都意味着我们在开始时提供的 ER 模型具有分散在不同实体框中的日期字段(Order 实体中的 OrderDate,Shipping 实体中的 ShippingDate 等)。虽然我知道维度模型必须有一个 DateDim,但我无法理解我们如何将这些日期字段从不同的实体框转移到我的维度模型中的一个 DateDim 中。这个问题可能很绿,但是我就是找不到suitable篇要么通过ER-Model/Dimensional-Model重塑概念的文章

通常的做法是让你的时间维度处于日期级别,列代表日期本身、月、年等。table 的键是一个整数看起来很像日期,例如20180303. 例如:

DateKey、CalendarDate、MonthName、MonthNum、Year

2018-03-03 2018-03-03 2018-03-03

(您可以在此处添加更多专栏以使其在许多不同方面都非常有用)

从过去的某个日期到未来的某个日期,每个日期在这里都有一行,你首先创建它,在你加载任何事实之前,甚至是你的日期你的事实中没有。在您选择的语言或 ETL 工具中,有多种方法可以轻松完成此操作,例如使用存储过程、电子表格、C# 等。

接下来是事实,而且只是事实。

在您的事实 table 中,您需要表示交货日期。您可以通过拥有(事实上 table)DeliveryDateKey 来做到这一点。假设您的事实记录的交付日期为 2018 年 1 月 2 日,您将在您的事实 table 中存储 20180102。 您不会在事实 table 中存储关于日期的任何其他内容,只是那个键。您也不需要更改日期维度:您只是创建一个从 Fact table 到 DimTime 或 DimDate 或任何您想称之为 table.[=10 的外键关系=]

您可能在此事实中有许多其他日期 table 和其他日期(例如 OrderDateKey),所有这些日期都将指向相同的 DimDate table.

同理,如果你的不同facts都指向Products,它们都指向DimProduct。

与其像 Rich 所建议的那样与一个维度建立外键关系,您可能更愿意在基本维度上创建 role-playing 视图。

例如,dimDeliveryDate 将创建为 dimDate 的视图,OrderDate、ShipDate 等角色也是如此。

这将使在 Tableau 和 PowerBI 等工具中的使用变得更加容易。

https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimensional-modeling-techniques/role-playing-dimension/

在决定外键时,您可能还希望考虑以下讨论。使用 'date as an integer' 作为键的风险在于人们将开始将其用作 DATE,而不是无意义的代理键。

https://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/