【问题标题】:Star schema, normalized dimensions, denormalized hierarchy level keys星型模式、规范化维度、非规范化层次级别键
【发布时间】:2016-05-30 02:21:07
【问题描述】:

给定以下星型模式表。

  • 事实,两个维度,两个度量。

#   geog_abb  time_date amount     value
#1:       AL 2013-03-26  55.57 9113.3898
#2:       CO 2011-06-28  19.25 9846.6468
#3:       MI 2012-05-15  94.87 4762.5398
#4:       SC 2013-01-22  29.84  649.7681
#5:       ND 2014-12-03  37.05 6419.0224
  • 地理维度,单层级,3 个层级。

#   geog_abb  geog_name geog_division_name geog_region_name
#1:       AK     Alaska            Pacific             West
#2:       AL    Alabama East South Central            South
#3:       AR   Arkansas West South Central            South
#4:       AZ    Arizona           Mountain             West
#5:       CA California            Pacific             West
  • 时间维度,两个层级,每个层级 4 个层级。

#    time_date time_weekday time_week time_month time_month_name time_quarter time_quarter_name time_year
#1: 2010-01-01       Friday         1          1         January            1                Q1      2010
#2: 2010-01-02     Saturday         1          1         January            1                Q1      2010
#3: 2010-01-03       Sunday         1          1         January            1                Q1      2010
#4: 2010-01-04       Monday         1          1         January            1                Q1      2010
#5: 2010-01-05      Tuesday         1          1         January            1                Q1      2010

示例去除了代理键以提高可读性。结果在层次结构中存在没有其他属性的级别,请不要打扰,它们仍然是层次结构中的级别。


在星型模式中表示为:

         GEOGRAPHY (all fields)
        /
       /
   FACT
       \
        \
         TIME (all fields)

在雪花模式中表示为:

                    geog_region_name
                   /
                  geog_division_name
                 /
                geog_abb (+ geog_name)
               /
              /
          FACT
              \
               \
                time_date
                   |
hierarchies:       |
        weekly    / \    monthly
                 /   \ 
                /     \
   time_weekday         time_month (+ time_month_name)
            |             |
            |             |
        time_week     time_quarter (+ time_quarter_name)
            |             |
            |             |
        time_year      time_year

你会如何调用以下架构

它有什么具体的名字吗?星花? :)

        |>-- geog_region_name
        |
        |>-- geog_division_name
        |
        |>-- geog_abb (+ geog_name)
        |
        |
        geography base
       /
      /
  FACT
      \
       \
        time base
        |
        |
        |>-- time_date
        |
        |>-- time_weekday
        |
        |>-- time_week
        |
        |>-- time_month (+ time_month_name)
        |
        |>-- time_quarter (+ time_quarter_name)
        |
        |>-- time_year

它基本上有一个维度库表,用于存储维度内每个层次结构的每个级别的身份。无需递归遍历雪花的级别,可能会减少连接。数据仍然很好地规范化,只有键被非规范化到 base 表中。所有层次结构中的所有级别都与维度基数中维度的最低粒度键相关联。
此外,拥有一个维度基础表允许仅在该表中以层次结构级别的粒度处理时间变量属性/时间查询。

这是表格表示。

仍然使用自然键!

  • 事实

#    geog_abb  time_date amount     value
# 1:       AK 2010-01-01 154.43 12395.472
# 2:       AK 2010-01-02  88.89  6257.639
# 3:       AK 2010-01-03  81.74  7193.075
# 4:       AK 2010-01-04 165.87 11150.619
# 5:       AK 2010-01-05   8.75  6953.055
  • 时间维度基数

#     time_date time_year time_quarter time_month time_week time_weekday
# 1: 2010-01-01      2010            1          1         1       Friday
# 2: 2010-01-02      2010            1          1         1     Saturday
# 3: 2010-01-03      2010            1          1         1       Sunday
# 4: 2010-01-04      2010            1          1         1       Monday
# 5: 2010-01-05      2010            1          1         1      Tuesday
  • 时间维度标准化到层次结构

#    time_year
# 1:      2010
# 2:      2011
# 3:      2012
# 4:      2013
# 5:      2014

#    time_quarter time_quarter_name
# 1:            1                Q1
# 2:            2                Q2
# 3:            3                Q3
# 4:            4                Q4

#    time_month time_month_name
# 1:          1         January
# 2:          2        February
# 3:          3           March
# 4:          4           April
# 5:          5             May

#    time_week
# 1:         1
# 2:         2
# 3:         3
# 4:         4
# 5:         5

#    time_weekday
# 1:       Friday
# 2:       Monday
# 3:     Saturday
# 4:       Sunday
# 5:     Thursday

#     time_date time_week time_weekday time_year
# 1: 2010-01-01         1       Friday      2010
# 2: 2010-01-02         1     Saturday      2010
# 3: 2010-01-03         1       Sunday      2010
# 4: 2010-01-04         1       Monday      2010
# 5: 2010-01-05         1      Tuesday      2010
  • 地理维度基数

#    geog_abb geog_region_name geog_division_name
# 1:       AK             West            Pacific
# 2:       AL            South East South Central
# 3:       AR            South West South Central
# 4:       AZ             West           Mountain
# 5:       CA             West            Pacific
  • 地理维度标准化到层次结构

#    geog_region_name
# 1:    North Central
# 2:        Northeast
# 3:            South
# 4:             West

#    geog_division_name
# 1: East North Central
# 2: East South Central
# 3:    Middle Atlantic
# 4:           Mountain
# 5:        New England

#    geog_abb  geog_name geog_division_name geog_region_name
# 1:       AK     Alaska            Pacific             West
# 2:       AL    Alabama East South Central            South
# 3:       AR   Arkansas West South Central            South
# 4:       AZ    Arizona           Mountain             West
# 5:       CA California            Pacific             West

维度基数也可以存储主键的属性,这会去重复维度的最低级别,但会不太一致(time_date 两个层次结构的级别都适合时间维度基数 表)。


这样的架构会有什么缺点?我不太关心连接和聚合的速度以及查询工具的适应性。
它有名字吗?正在使用吗?如果不是为什么?

【问题讨论】:

  • > “这种模式有什么缺点?我不太关心连接和聚合的速度,以及查询工具的适应性。”
  • @mef 内存。隔离模型的组件以进行更精确的处理。维度的所有层次结构级别形成了一个无事实事实的维度基础。所有参考数据均已标准化,这意味着可以更快地在报告中重复使用。
  • 这个模型只有在你没有聚合表的情况下才有效,否则你需要为每个聚合级别创建一个新的维度关系表,非常烦人并且没有真正的增值
  • @mucio 这对于常规星型模式也是如此,不是吗?因为您实际上并没有存储更高级别的密钥。
  • 在星型模式中,您需要一个缩小的维度(可以是带有distinct 的视图)来加入聚合表,在您的情况下,您需要一个额外的连接来获得这个缩小的维度( How do I get from division to Region? 与基表连接区域表不同,在星型模式中,您只需执行与地理不同的区域)。无论如何,在我看来,您存储了两次相同的信息(在基本和最低层次结构中);启动模式存储更多数据,但连接更少,雪花更少数据,更多连接。

标签: data-modeling data-warehouse database-normalization star-schema data.cube


【解决方案1】:

您正在使用快捷方式构建雪花模式。

使用过,BI工具可以轻松使用快捷方式。

您还可以使用从维度的父级到该维度的子级事实表的快捷方式。它有效,您可以跳过连接,但您需要在事实表中存储一个额外的列。

唯一关心的是数据完整性,如果父子关系发生变化,您不仅需要更新子表,还需要更新存储此关系的所有其他表。

如果您每次都根据规范化数据生成维度表,这没什么大不了的,但您需要小心,如果您将父 ID 存储在事实表中,则更要小心。

【讨论】:

    【解决方案2】:

    您正在做的不是雪花模式......它类似于“Data Vault”和我们自己的变体“Link-Model”。它本质上创建的链接表只包含位于 Fact 表和 Dim 表(以及其他 Dim 表)之间的键。虽然,我们将它们描述为实体表和度量表。

    优点是

    • 您可以并行加载维度表和事实表,然后填充链接表
    • 可以很容易地处理复杂的做法,例如“在报告时”和“保险”中的“调整”等
    • 将由链接表链接的缓慢和快速变化的维度维度表更直观。这样可以节省时间。
    • 向事实表添加新维度相当简单快捷,毕竟它只是向仅包含整数的表添加一个额外的整数列。
    • 无事实的事实比传统模式中的直观得多。您可以在维度之间创建关系,而无需任何事实记录。

    缺点是

    • 架构结构稍微复杂一些,因此我们通常在“链接模型”之上创建一个 Kimball 模型,因为业务用户倾向于很好地理解它。
    • 向事实表添加新维度或扩展维度表很容易,但随着时间的推移,架构可能会变得杂乱无章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2016-12-14
      • 2018-09-01
      • 1970-01-01
      • 2017-09-06
      • 2013-08-21
      • 2016-05-13
      • 2018-06-06
      相关资源
      最近更新 更多