6

刚刚进入数据仓库,需要您的帮助来澄清一个困惑。假设我有员工维度和部门维度。如果我有一份报告要求我列出来自 dimEmployee 的字段(姓名、薪水、职位)和来自部门的字段(DeptNo、Desc、经理),我该怎么做。我是否创建一个事实表(无事实),它将成为这两个维度之间的连接表?还是我需要以不同的方式设计这两个表。每个人都在谈论事实和维度,但是我们甚至考虑过链接维度表吗?

感谢您的见解。

RK

4

6 回答 6

3

员工和部门之间必须有关系。这通常通过将列 DepartmentId 添加到 Employee 表来完成。

于 2009-05-19T22:19:32.553 回答
1

如果您保持维度相互独立,在人员维度中没有部门引用,在部门维度中没有人员引用,则分配事实表可以充当两者之间的桥梁。

例如



Person Table
------------

PersonID
Forename
Surname
EffectiveFromDate
EffectiveToDate


Department Table
----------------

DepartmentID
DepartmentName

etc


AssignmentFact Table
--------------------

AssignmentID (primary key)
PersonID (foreign key to person table)
ManagerID (foreign key to person table)
DepartmentID (foreign key to department table)
Salary
CostCentre
EffectiveFromDate
EffectiveToDate.

因此,对人员分配的更改(例如直线经理或晋升的更改)不需要更改维度,而只需更改事实表,这将提供一个很好的简单历史更改记录。当您有多个事实表共享这些维度时,保持它们的简单性会带来好处。尝试两者的简单实现并尝试一下,我相信您会发现这更自然。

于 2009-06-12T20:46:59.490 回答
1

谢谢大家的回复。因此,如果需要在某个工资范围内查找部门中的员工总数,并且还需要列出部门中的员工,则设计可能如下所示

dimEmployee
EmpId
部门
名称
等...

dimDept
DeptId
Desc
Manager
等....

fctEmpDept
empId
DeptId
Salary

当我阅读有关数据仓库的信息时,我只看到维度和事实表。如果需要显示用于正常报告目的的列表,我真的很困惑表格的结构。显然,可能有一些维度可能与外键相关联。

于 2009-05-20T16:00:58.287 回答
1

选项A:如果每个员工只能属于一个部门。我会将 departmentID 添加到事实表中。

选项 B:如果员工可以属于多个部门,我会选择第三种选择,即设置度量表(或聚合事实表)。然后,您将按部门汇总您的员工,并将汇总后的数字存储在这个新表中。

选项 C:您可以将部门 ID 添加到员工表中,这样可以完成工作,但是您将设置一个层次结构。您可以这样做,但随着数据集的增长,您的连接会变得困难且效率降低。

我会选择前两个选项之一,具体取决于您的员工/部门关系。

我承认还有其他可用的解决方案,但这些将是您最好的选择。

于 2010-07-13T02:01:02.817 回答
0

任何问题的典型维度包括时间(总是)、地理(例如,部门、地区、州等)等。在您的情况下,听起来像公司阶梯中的工资范围、职位等可能是相关的。

事实表通常包含附加的东西(例如,给定工资范围内的个人数量、职位等)。

我不确定 Employee 是否有资格作为维度;对我来说听起来更像是一个事实。

于 2009-05-19T22:54:10.283 回答
0

当您谈论维度和事实表时,您通常指的是聚合数据。您可以编写一份报告,讨论每个部门的员工人数。

听起来您正在处理数据列表。使用直接 SQL 可能会更好地实现这一点。所以像

 SELECT person.Name, person.Salary, Person.Position,
 Department.DeptNo, Department.Desc, Department.Manager
 From person
  join Department on person.DeptId = Department.Id
于 2009-05-19T22:14:53.997 回答