假设我们有D_PROCESS
和作为维度,以及将流程(什么)与工人(负责人)和“当前”状态联系起来的D_WORKER
事实。D_STATUS
F_EVENT
进程状态随时间而变化。我们应该在F_EVENT
每个进程/状态/工作者存储一行,还是每个进程/工作者一行,并且“其他地方”为给定进程/工作者的每个状态更改存储一行?
我是 Datawarehouse 的新手,很难找到与数据建模相关的最佳实践/教程。
假设我们有D_PROCESS
和作为维度,以及将流程(什么)与工人(负责人)和“当前”状态联系起来的D_WORKER
事实。D_STATUS
F_EVENT
进程状态随时间而变化。我们应该在F_EVENT
每个进程/状态/工作者存储一行,还是每个进程/工作者一行,并且“其他地方”为给定进程/工作者的每个状态更改存储一行?
我是 Datawarehouse 的新手,很难找到与数据建模相关的最佳实践/教程。
阅读Ralph Kimball 的The Data Warehouse Toolkit,了解维度建模的良好介绍。
听起来您将流程更改事件存储在 F_EVENT 中。如果这个过程有一个定义的开始和结束,我会构建一个快照事实表,它可以让你随着时间的推移跟踪这个过程(只需在每次过程从一个步骤移动到另一个步骤时更新行)。
编辑:
我将尝试使用您的尺寸作为示例来制作一般情况。
对于 D_PROCESS,建模“流程”通常不建模为维度,您称其为“什么”,因此我将其重命名为“D_ACCOUNT”。
基本数据模型将用于“税务处理系统”,其中 WORKERS 正在处理 ACCOUNTS,并且每个 ACCOUNT/WORKER 组合具有该流程当前所处位置的几个可能的“状态”。
D_ACCOUNT
ACCOUNT_NUMBER
ACCOUNT_TYPE
D_WORKER
WORKER_ID
FIRST_NAME
LAST_NAME
BADGE_NUMBER
SHIFT
D_STATUS
STATUS_ID
STATUS_NAME
现在,如果我想报告由工作人员执行的帐户发生的所有“事件”,我可以构建一个事务级事实表 F_EVENT:
F_EVENT
ACCOUNT_ID
WORKER_ID
STATUS_ID
EVENT_TIME_ID
Metrics taken at time of the measurement (Cost, Worker time spent, etc)
我们将标识行的唯一维度组合称为事实表的粒度或粒度。
此表的粒度是 Account、Worker、Status 和 Time。它回答了诸如“我在 3 班轮班的员工在周三花了多少时间处理账户?”之类的问题。或“发生了多少事件将处理状态更改为“已关闭”?
我不确定这种类型的桌子会有多大帮助。
相反,假设您有兴趣在流程通过各种状态时跟踪流程本身。我将假设状态总是及时向前移动,从“未开始”到“处理中”再到“关闭”。
我将构建 Kimball 所说的“累积快照事实表”。
F_TAXPROCESSING
ACCOUNT_ID
WORKER_ID
CURRENT_STATUS_ID
NOT_STARTED_DTTM
NOT_STARTED_FLAG
IN_PROCESS_DTTM
IN_PROCESS_FLAG
CLOSED_DTTM
CLOSED_FLAG
该表的粒度是 Account, Worker。此表通过更新状态更改的日期/时间以及达到该状态时的标志来跟踪“过程”。
这使您可以随着时间的推移跟踪流程,让您查看有多少帐户对“处理中”状态做出反应,到达那里需要多长时间等等。