代码之家  ›  专栏  ›  技术社区  ›  fancyPants

对星型模式设计的一般理解

  •  1
  • fancyPants  · 技术社区  · 14 年前

    所以,我想我理解了在维度中放置什么,在事实表中放置什么,以及如何实现这一点。 现在我有一个问题,我有一个维度“product”和一个维度“productproperties”。我必须把这个分开,否则我在“产品”中的自然键就不再是唯一的了。我问过这个 this question .

    因此,我的“productproperties”维度表应该如下所示: 颜色材质尺寸

    1.)为了实现这一点,我必须创建“颜色”、“材质”、“尺寸”等所有可能的值排列,对吗?

    这将远远超过2亿行,所以我决定将其拆分。 我现在有了一个维度“color”,它实际上由列“color”、“colorfront”、“colorback”组成。

    2.)我想没关系,但是维度“大小”呢?它只包含列“代理项”和“值”?

    我已经读过“退化维度”(在我另一个问题中给出的阅读建议中),这意味着,要在事实表中使“单列维度”成为一列。这对我来说似乎有点不切实际,因为我最终会在事实表中多出5-6列。

    如果我应该这样做呢?

    3.)这些退化维度是事实表中主键的一部分吗?

    最重要的问题: 我将在事实数据表中包含与我的维度中的每一列或并非所有维度都不匹配的产品条目。也就是说,我可能有一个条目/产品,它具有“color”属性,但不具有“colorfront”或“colorback”属性。 因为我创建了“color”、“colorfront”和“colorback”的每一个排列,当试图填充事实表时,我将得到多个代理键,如果产品只有“color”属性,这会导致事实表中出现某种重复,对吗?

    4.)那么在查询我的事实数据表时,我是否需要过滤掉那些重复的数据?或者这是错的?

    我当然可以将维度“颜色”分为三个维度。但随后我将在一些列中获得具有空值的条目。与完全不使用某些维度的条目/产品相同。

    5.)如何处理这些空值?

    事先谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Damir Sudarevic    14 年前

    每个维度都有:

    • 主键( DateKey , TimeKey , ProductKey ,…)
    • 业务密钥( FullDate , ProductFullName , ColorNaturalKey ,…)
    • 值为“未知”的行( Key =0, BusinessKey ='未知',所有其他='不适用')
    • 值为“N/A”的行( 钥匙 = -1, 业务密钥 ='N/A',所有其他='N/A')

    Color 表,列 颜色 , ColorFront ColorBack 所有的值都是“n/a”和“unknown”——所以这些值应该包括在排列中。这样,维度表中始终有一行可指向。

    您可以通过移动 SizeValue 放入事实数据表并将 dimSize .

    alt text

        2
  •  3
  •   Stephanie Page    14 年前

    1) 无论谁告诉你:

    所以我的“productproperties”维度表应该是这样的:颜色材质大小

    要么是错的,要么是你误解了。

    这种想法被称为“垃圾维度”。它不需要包含笛卡尔积。它可以像其他维度一样加载。如果事实数据表中需要组合,而维度中不需要组合,那么可以添加它。从笛卡尔开始是一种方便,但你最好知道,当一种新的颜色被添加时,你必须重新笛卡尔。最好在需要时加载,不要担心。

    2) 好吧,现在我读了你的全部问题,意识到你在读关于维度建模的文章,但看起来你在略读它。

    退化维类似于采购订单号。这不是事实。你不能求和。但这也不是一个维度,因为关于PO123210413没有什么比需要说的更多的了。任何地方都不是FK。