将很少更改的维度折叠为事实列
Collapsing Rarely Changing Diminsions to a Fact Column
在星型模式设计中,事实table(s)的维度table几乎是必须的。在许多业务案例中,建模者可以有把握地假设某些维度值不会在没有控制的情况下发生变化。例如,性别有时被用作一个维度,实际上它也可以是事实 table 中的一列。
我不确定人们是否一直在考虑这个问题。只添加一个维度而不考虑它更容易。然而,作为 Kimball 规则之一,一个事实不应该有太多的维度 table(我认为他建议的数字大约是 20)。
我以性别为例,但还有很多其他的,例如州名、城市名、信用卡类型等
我的问题是:
应该使用什么规则来决定 embed/Collapse 事实中的值 table 还是为其单独的维度?
一些可能的答案是:
1. 当它没有改变时(例如性别)。
2.当它可能的值很少并且长度很短时?
还有什么?
编辑
虽然我认为这个问题已经回答了,但我还是去进一步研究了。在某些情况下,您 可能 需要使用维度。案例在这里:
"Fact dimensions are frequently used to support drill through actions because the drill through action in SQL Server Analysis Services (SSAS) requires that you select the attributes from a dimension. So if you users want to see certain fields when they do a drill through, you must have those fields in a dimension."
以上内容转自此处Degenerate Dimensions
我认为这个主题需要感兴趣的人进一步分析。
听起来您在描述 Kimball 所说的 "degenerate dimensions" - 您将维度值直接存储在事实 table 中。 Kimball 自己对这些的看法是,当您只有该维度的一列时就可以使用它们。它通常与事实的基数非常低。一个很好的例子是采购订单 - 您将有一个采购订单事实 table,然后有一个名为 PurchaseOrderReference 的列,它实际上是一个退化的维度,而不是具有一对一的采购订单维度事实。
但是,保持维度数量相当低的原因是为了防止事实 table 变得太宽 - 如果您开始将维度列放入事实中,它们会变得更宽,性能会受到影响。例如,如果您要添加大型字符串列或某些数字格式,这些列可能会大于维度键列 - 如果您要添加多个列,而您可以使用单个维度键,则影响会更大。
这个问题的解决方案是维度的非规范化。你提到州和城市——它们很可能一起进入一个位置维度,然后你只有一个维度键从你的事实到位置维度,而不是两个(一个到城市,一个到州)。您的性别示例可能是退化维度的候选者,但前提是性别是您存储的人的唯一属性。如果你有一个人的维度,甚至有几个关于人的属性(比如性别、身高、头发颜色),这些最好放在一个维度上。
你是对的,很多人没有这样设计 - 我认为这是因为很多人习惯于更规范化的数据库,其中单独的城市和州 tables 是正常的(并且正确),因此他们错误地创建了许多具有少量属性的维度,其中一些更宽的维度会更好。
在星型模式设计中,事实table(s)的维度table几乎是必须的。在许多业务案例中,建模者可以有把握地假设某些维度值不会在没有控制的情况下发生变化。例如,性别有时被用作一个维度,实际上它也可以是事实 table 中的一列。
我不确定人们是否一直在考虑这个问题。只添加一个维度而不考虑它更容易。然而,作为 Kimball 规则之一,一个事实不应该有太多的维度 table(我认为他建议的数字大约是 20)。
我以性别为例,但还有很多其他的,例如州名、城市名、信用卡类型等
我的问题是:
应该使用什么规则来决定 embed/Collapse 事实中的值 table 还是为其单独的维度? 一些可能的答案是: 1. 当它没有改变时(例如性别)。 2.当它可能的值很少并且长度很短时?
还有什么?
编辑
虽然我认为这个问题已经回答了,但我还是去进一步研究了。在某些情况下,您 可能 需要使用维度。案例在这里: "Fact dimensions are frequently used to support drill through actions because the drill through action in SQL Server Analysis Services (SSAS) requires that you select the attributes from a dimension. So if you users want to see certain fields when they do a drill through, you must have those fields in a dimension."
以上内容转自此处Degenerate Dimensions
我认为这个主题需要感兴趣的人进一步分析。
听起来您在描述 Kimball 所说的 "degenerate dimensions" - 您将维度值直接存储在事实 table 中。 Kimball 自己对这些的看法是,当您只有该维度的一列时就可以使用它们。它通常与事实的基数非常低。一个很好的例子是采购订单 - 您将有一个采购订单事实 table,然后有一个名为 PurchaseOrderReference 的列,它实际上是一个退化的维度,而不是具有一对一的采购订单维度事实。
但是,保持维度数量相当低的原因是为了防止事实 table 变得太宽 - 如果您开始将维度列放入事实中,它们会变得更宽,性能会受到影响。例如,如果您要添加大型字符串列或某些数字格式,这些列可能会大于维度键列 - 如果您要添加多个列,而您可以使用单个维度键,则影响会更大。
这个问题的解决方案是维度的非规范化。你提到州和城市——它们很可能一起进入一个位置维度,然后你只有一个维度键从你的事实到位置维度,而不是两个(一个到城市,一个到州)。您的性别示例可能是退化维度的候选者,但前提是性别是您存储的人的唯一属性。如果你有一个人的维度,甚至有几个关于人的属性(比如性别、身高、头发颜色),这些最好放在一个维度上。
你是对的,很多人没有这样设计 - 我认为这是因为很多人习惯于更规范化的数据库,其中单独的城市和州 tables 是正常的(并且正确),因此他们错误地创建了许多具有少量属性的维度,其中一些更宽的维度会更好。