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

Put hierarchy in its own separate dimension or set it as a part of related dimension?

我是 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

第二个

员工是WHO,部门是WHERE。

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

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

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

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

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

    的另一点
  • CAN AN EMPLOYEE BE IN MULTIPLE SETS SIMULTANEOUSLY?: 如果一名员工可以同时在多个部门工作,那么您可能确实需要事实 table 来模拟这种关系(否则,每个员工都需要在员工维度 table 中有两条活动记录。将它们放入 单独的维度 .

    的要点
  • DO EMPLOYEES CHANGE SECTIONS FREQUENTLY?: 如果是这样,并且您只有一个维度,您最终将不得不不断地修改员工维度中的员工记录 - 这会导致更长的时间比需要的维度 table 如果这是第二类缓慢变化的维度(即您正在跟踪维度元素更改历史的维度)。将它们放入 单独的维度 .

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

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

    的要点

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