将层次结构放在自己单独的维度中还是将其设置为相关维度的一部分?

问题描述

我刚接触 the dimensional model 的数据仓库设计,在我的第一个设计中遇到了一些困惑。

我拿了一个简单的业务流程(Vacation Request),我想问一下这两种设计中哪一种是准确且接近有效和适用的,如果我得到详细的答复,我将不胜感激? (我的问题主要是关于尺寸设计的)

1- 

Dimension.Employee           Fact.Vacation
[Employee Key]               [Employee Key] FK PK
[_source key]                [Vacation Transaction]PK DD
[Employee Name]              ...
....                         ...
[Campus Code]
[Campus Name]
[Department Code]
[Department Name]
[Section code]
[Section Name]
.... 

2- 

Dimension.Employee           Dimension.Section         Fact.Vacation
[Employee Key]               [Section Key]             [Employee Key] FK PK
[_source key]                [_source key]             [Vacation Transaction]PK DD
[Employee Name]              [Department Code]         [Section Key]FK
....                         [Department Name]         ...
....                         [Campus Code]
                             [Campus Name]

层次结构是这样的:

Campus Contains --> 
Many Departments and each department contains --> 
many sections and each section contains many employees

解决方法

好问题!我自己也遇到过多次这种情况。恐怕这会让人有点困惑,最终的答案是“视情况而定”,但这里有一些需要考虑的事项...

  • STAR SCHEMA 的真正含义:虽然人们将数据仓库视为报告数据库,但它实际上执行两个功能:数据集成和数据分发。事实证明,最好的集成数据结构并不适合分发(这是我几年前写的blog post)。星型模式实际上是关于数据分布 - 快速轻松地从系统中获取数据。最好的数据结构没有连接,即它们类似于平面文件(是的,我意识到有一些 DB 缓冲考虑因素可能会对此产生一些影响,但一般意义上,索引平面文件确实避免了所有连接)。

星型模式获取该平面文件并对其进行一些规范化,主要是为了节省磁盘空间(当您必须在每个记录上写出每个维度的每个属性时,这是一个巨大的空间浪费)。因此,当人们说星型模式是非规范化的时,他们是部分不正确的。维度表是非规范化的(雪花模式将这些规范化)但事实表是规范化的 - 它有一堆依赖于唯一主键的属性。

因此,这个概念将指向最小化维数以最小化您需要进行的连接数。点将它们放入一维

  • 事实表显示关系:您的事实表显示其他不相关的维度元素之间的关系。例如,在没有销售的情况下,产品和客户之间没有关系。销售创建了这种关系,销售事实记录对其进行建模。在您的情况下,部门和员工之间存在自然关系(至少我认为)。您不需要事实表来为这种关系建模,因此,它们都应该在一个维度表中。将它们放入一维的另一点。

  • 一个员工可以同时在多个部门吗?:如果一个员工可以同时在多个部门,那么您可能确实需要事实表来为这种关系建模(否则,每个员工都需要两个活动记录在员工维度表中)。将它们放入单独的维度

  • 员工是否经常更改部分?:如果是这样,并且您只有一个维度,您最终将不得不不断修改员工维度中的员工记录 - 这会导致维度表比所需的更长如果这是第二类缓慢变化的维度(即您正在跟踪维度元素更改历史的维度)。将它们放入单独的维度

  • 您需要按部分聚合吗?:如果您有很多部分并且经常在部分级别进行报告,则可能需要创建一个在部分级别聚合的事实表。在这种情况下,如果您坚信让您的数据库强制执行您的关系(我是),那么您将需要一个与事实表相关的部分表。在这种情况下,您将需要一个截面表。将它们放入单独的维度

  • 其他事实表会使用节维度吗?:当您使用一致维度(即由多个事实表共享的维度)时,会出现星型模式的一种棘手情况。当在维度层次结构中的不同级别定义不同的事实表时,就会出现问题。在您的情况下,假设有一个不同的事实表,假设购买了一个建模设备,并且它仅在部门而不是员工级别有意义。在这种情况下,您可能会将部分维度拆分到它自己的表中,以便它可以由两个事实表共享,即您当前的事实表和未来的设备表。顺便说一句,这类似于前面提到的与聚合表相关的考虑因素。将它们放入单独的维度

无论如何,这超出了我的想象。所以,我想答案是“视情况而定”。两者都可以,这取决于您尝试优化的其他因素。如果想到其他任何事情,我会尝试编辑我的答案。祝你好运!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...