如何对链接到具有不同粒度级别的多个事实的维度表进行建模?

Posted

技术标签:

【中文标题】如何对链接到具有不同粒度级别的多个事实的维度表进行建模?【英文标题】:How to model a dimension table that link to several facts with different level of grain? 【发布时间】:2019-10-23 06:41:05 【问题描述】:

我有一个事实是存储客户的地址。问题是,客户可以选择在州级、县级或街道级插入信息。在操作数据库中,街道有一张表,县链接到另一个表,州链接到另一个表。客户表有 1 列用于州,1 列用于县,1 列用于包含 ID 的街道(因此可以链接到层次结构中的更高对象) 如何在星型模式中建模事实与维度之间的关系?

所以我创建了一个包含所有州、所有县、所有街道的 Location 维度。表格如下所示:


DIM_ID  | Level     | Street columns        | County columns        | State columns
1       | Street    | Bolsa                 | Westminton            | California
2       | County    | Westminton [county]   | Westminton            | California
3       | State     | [State of] California | [State of] California | California

如果客户披露街道然后事实记录链接到第 1 行,客户披露县级然后事实记录链接到第 2 行,客户只披露州然后事实记录链接到第 3 行。

您如何看待这种方法?

【问题讨论】:

【参考方案1】:

我可能会分别对这些级别进行建模,因为它们被视为单独的,即:

昏暗的街道 dim.County dim.State

至于将这些与客户相关联,我会选择桥接表,例如:

CREATE TABLE ClientStreet
(
    ClientID
    , StreetID
)

等等

如果你不能在不提供县和州的情况下提供街道,或者在不提供州的情况下提供县,我将在 dim.Street、CountyID 和 dim.County、StateID 内,即层次结构。

编辑

对于您的具有 3 个 ID 的客户维度,这也可能是一个很好的模型。

关于我的层次结构和一般的数据建模,我觉得你的建模方式确实需要:

    反映现实(例如,将客户的街道记录为“[加利福尼亚州]”对我来说似乎不准确)。 反映在传入数据方面可能实现的现实,即您的客户是否输入了一次地址,或者他们可以更改地址(您想跟踪更改吗?)?

我想知道的一件事是,您的客户是否必须选择其中一个级别来记录他们的地址。在这种情况下,我要么拥有上面建议的模型,要么拥有具有 3 个 ID 的客户端维度和 CHECK CONSTRAINT,以确保仅填充其中一个。然后,街道将具有 CountyID 等这一事实将得到支持。因此,您将确定在客户端维度中填充 ID 的这种“渠道”。

【讨论】:

您好,感谢您的帮助。我应该补充一点,客户表有 1 列用于州,1 列用于县,1 列用于街道,它们都包含 ID(因此可以链接到层次结构中的更高对象),因此适合您提出的层次结构。您能否详细说明该方法? 老实说,这对我来说听起来不错,一个具有各种地址组件 ID 的客户维度。如果这就是它的设置方式,我不确定您为什么需要位置维度。例如,对于仅提供状态的客户端,我只需将其他两个 ID 设为NULL。让我补充一些解释。

以上是关于如何对链接到具有不同粒度级别的多个事实的维度表进行建模?的主要内容,如果未能解决你的问题,请参考以下文章

DataWarehouse - 具有不同粒度/维度度量的事实表

如何使用不同谷物的事实表对日期维度进行建模

两个层次相同但粒度不同的事实表

事实和维度数据仓库 Datamart

具有不同级别日期维度数据作为日期维度键的事实表

合并来自不同粒度维度的数据