在事实/维度星型模式上构建缓慢变化的维度

Mic*_*utz 5 data-warehouse database-design slowly-changing-dimension star-schema

我听说过关于如何设计关于事实表中的内容和维度表中的内容的星型模式的教科书定义,例如:

事实表应包含有关对象的核心信息,维度应包含有关事实的信息

(转述)

但是,实际上在业务中,我看到过设计的星型模式,其中事实表包含代理键、业务键和对象的所有单值字段,每个维度存储对象的所有多值字段(因此是维度这个词)。例如,一个人可能是事实表中表示的对象。一个人有一个名字、一个年龄等,这些都在事实表中构成了可行的事实。一个人可能拥有多辆汽车,每辆汽车都有自己的属性,这些属性代表一个人的汽车维度,存储为一个维度表,其中包含多个列来描述每辆车的属性。在这个例子中,这个维度表还包括一个外键,表示来自事实表的相应行的业务键。

所以,如果我们同意这可能是一个合适的设计,我试图克服的问题是如何在多值维度表上执行 SCD 类型 2(历史)。对于我充满单一事实的事实表,这是显而易见的。我包括两个额外的列,有效日期和到期日期,并且我使用业务密钥链接公共记录,其中最近的记录具有NULL到期日期,并且同一业务密钥的所有其他历史记录都具有有效日期和到期日期表明他们是最新记录的时间点。

如何在表示多值列表的维度上使用相同的概念?我基本上想要相同的概念,我可以(1)识别当前列表(在这个例子中,一个人拥有的汽车)和(2)识别历史上任何给定时刻的列表。我可以在每个维度值上设置有效日期和到期日期吗?那么我如何区分一段时间后添加的值?还是删除的值?

但是,如果我们不同意这种设计方法,请告诉我什么行业标准,这样我才能正确地做到这一点。

Gri*_*ldi 3

通常,维度表包含所有字段的单个有效时间(开始日期和结束日期),并且 SCD2 将应用于完整记录。最好提前使用非空结束值来标记当前有效的记录,因为这可以简化查询。过去的结束日期将表示删除或您定义的任何其他语义(例如离开国家或不再受雇的人)。还可以将代理键添加到维度表中以唯一标识记录。

事实表通常包含诸如销售额或成本之类的“度量”,或者表示诸如已拨电话或这些呼叫的持续时间之类的事件。人们通常会在报告中的这些列上使用聚合。

星型模式是一种对稀疏填充的“立方体”进行建模的方法,其中坐标系的每个轴都由一个维度表给出。使用此模型,报表中的“切片和切块”操作和“向上钻取/向下钻取”操作可以很好地转换为 SQL。

在您的汽车和人员示例中,我将使用两个维度表,一个用于汽车,一个用于人员,每个维度表都有历史记录(根据 SCD2),以及一个由维度表的外键组成的非事实事实表,引用各自的标识符(实体标识符) )和有效时间列(SCD2)。在此设计中,如果维度表之一发生更改,您将不会根据 SCD2 规则在事实表中添加记录。

通过这种方式,您可以对每个实体的变化进行建模,例如人的姓名变化、汽车的颜色变化以及汽车和人之间的关系(例如所有权)。每个表将为每个业务键使用不重叠的有效时间(开始值和结束值),独立记录这些实体的历史记录。该模型中的事实表基本上是 am:n 链接表,为其保留有效时间的单独历史记录。

您可以通过在每个表上使用当前x between start and end(或过去)查询来识别当前和过去的列表(回答您的(1)和(2) - 忽略间隔是右开还是左开)。

现在可以使用时间连接和“顺序”查询(有时也称为“合并”查询)来回答摘要统计信息,例如某个具有完整历史记录的城市有多少辆汽车(假设城市是人员维度表的一部分)。参见Snodgrass,第 6.3ff 章