DWH - 数据仓库 - 设计

时间:2017-02-28 12:57:40

标签: etl data-warehouse

我正在尝试为报告系统设计DWH,并想向profis询问他们对最佳设计的看法。

它更复杂,但要保持简单,请假设以下情况:

  • 每位客户都有“汽车组”
  • 每个客户都要检查“待办事项”,
  • 可能存在与每位客户相关的“致电”

在我们的数据库中,每个主题的数据(客户 - 汽车 - 待办事项 - 呼叫)都存储在表格中。 Customer表与(cars - To-dos - Calls)表有一对多的关系,如图所示

enter image description here

我在考虑让报告系统设置以下维度和事实表: - DIM_Customer - DIM_Car - DIM_To-do - DIM_Call - Fact_ALL

正如我所提到的,它更复杂  无论如何,我现在被困住,因为不清楚如何聚合我的事实表 - >因为有一组汽车和一组待办事项和多个电话

DIM_Customer_ID DIM_Car_ID DIM_To-do_ID DIM_Call_ID Cars_Count To-dos_Count Calls_Count

  • Q1:在每个(汽车,待办事项,通话)维度与事实表之间使用桥接表 - >它的粮食是“每组客户每组客户每组呼叫,对吗?”还有其他更简单或更好的解决方案吗?如何解决这样的基数?

  • Q2:在Db中,每个客户都有一个唯一的ID - >是否可以使用此customer_ID连接维度表和事实表?或者不建议这样做,因为dim和fact表现在没有(PK-FK)连接(customer_ID只是作为DIM_customer中的PK而是作为其他DIM中的FK)...我只是想尽可能简单

enter image description here

  • 问题3:是否有更好或更多位置的DWH设计

这是我的第一个DWH设计,如果有任何愚蠢的想法,请原谅:)

谢谢

2 个答案:

答案 0 :(得分:1)

与往常一样,驾驶问题应该是"我想测量/聚合什么?"和"我如何切片和切块数据?"。那些分别为你提供表格和维度表。

事实表

如果您只想测量客户拨打的电话数量以及完成所需的待办事项列表,则单个事实表(Fact_Event或类似信息)将为您提供良好的服务。添加Call和Todo键并输入键0或-1(包含该维度记录中的所有字段' N / A'),表示不适用的维度。

另一方面,如果Todos在不同时间完成了大量步骤,并且您想要测量步骤之间的进度和前置时间,那么将它们存储在具有完整列表的单独事实表中更有意义几乎不适用于通话的日期键。

在所有情况下,您都会链接到Car和可能(请参阅下一部分)客户维度及其两个键。

维度表

在您的评论中,您声明每位客户只出现一次,只有一组汽车。这使得它们变得非常传统,因为客户采用这种类型的解决方案,作为关于(返回)客户的信息。购买选择和支持需求(成本)被认为是非常有价值的。

在这种情况下,最不复杂的场景只有一个维度,称为Car或Car_Customer。然后,该维度将包含汽车详细信息,组标识和所有相关客户详细信息。如果您的普通客户有一组1-5辆汽车,他们的详细信息只会多次重复,这比多次加入更好。

由于层次结构良好,报告用户在按客户,汽车或任何组合方式组织数据时不会遇到任何问题。

如果您决定终止回头客(即使他们总是在源系统中进入新鲜状态),您可以在ETL中添加客户匹配/合并例程,然后单独的客户维度更有意义。

汽车组(或合同?)作为一个单独的维度只有在客户拥有多个和/或汽车在不同时间可以是不同的组时才有意义。在这种情况下,我建议只通过事实表链接它,在那里添加一个Group键。维度之间的桥接表可能会变得混乱。

替代方案:不要使用维度模型

您所拥有的数据似乎不适合Dimensional模型,该模型的设计理念是经常重复的数据(如客户详细信息和产品详细信息)进入具有低行数的宽维度表,而保留事实表狭窄,允许在高行数下获得良好性能。

在您的情况下,汽车似乎是唯一经常重复的实体,甚至从您描述的模型中也不清楚。将表格建模为与第一张图片中的源模型类似,甚至使用相同的唯一ID,添加报告所需的额外标记,描述和类别更有意义。

只有当您想跟踪这些表(例如汽车)的变化时,您才需要引入维度逻辑。

答案 1 :(得分:1)

您似乎误解了事实表应该是什么。事实是对事件发生的事件的测量。

作为示例的一个子集,假设FactCarPurchase包含Count,Mileage,PurchaseDate,DimCustomer的PurchasePrice切片等措施,可以让您查看每位客户的平均汽车数或一位客户的汽车数,或平均里程数由客户驱动,或由客户支出。通过DimCars切片可以通过Make / Model启用AverageMileage / AveragePurchasePrice或CountOfCars等测量。

事实捕捉了措施"事实"关于一个事件。您通常会有多个事实表,除非您的模型非常小,否则单个事实几乎不可能链接到每个维度。

首先,首先描述您想要衡量的内容(购买事件,旅行事件,修复事件),然后确定哪个维度有意义链接到事实。同样,这种关系可能会经历多个方面和事实。例如,如果您想知道客户一年内维修的费用,您的模型可能如下所示:

dCustomer< - fCarPurchase - > dCars< - fCarRepair - > dDate