Powerbi 在星型模式模型中,我们应该有粗分支还是细分支
这个问题没有令人满意的答案。请鼓励您回答或评论Powerbi 在星型模式模型中,我们应该有粗分支还是细分支,powerbi,relationship,dax,Powerbi,Relationship,Dax,这个问题没有令人满意的答案。请鼓励您回答或评论 让我们考虑下面的数据模型。我们的模型中有三个维度。如果你需要命名它们,可以是(A)产品,(B)品牌,(C)地区。B是a的容器,因此它是一个层次结构。一个品牌的许多产品。表示为A、B、C、AB、ABC的表是只包含唯一值的桥接表 现在问题是: 以下模型中是否需要AB桥接表?我们不能吗 将A和B表直接连接到ABC 为所有维度创建笛卡尔积是个好主意吗 在模型中作为中心桥接表 我们应该用AB维度插入预算表以桥接AB还是 桥ABC?取决于第一个问题的答案 我们
让我们考虑下面的数据模型。我们的模型中有三个维度。如果你需要命名它们,可以是(A)产品,(B)品牌,(C)地区。B是a的容器,因此它是一个层次结构。一个品牌的许多产品。表示为A、B、C、AB、ABC的表是只包含唯一值的桥接表
现在问题是: +-------+
| |
| A +-----+
| | |
+-------+ |
|
v
+-------+ +--+----+ +--------+ +------------+
| | | | | | | Sales |
| B +--> AB +----->| ABC +----->| ABC |
| | | | | | | |
+-------+ +--+----+ +---+----+ +------------+
^
|
+-------+ | +------------+
| | | | Budget |
| C +---------------------+ | AB |
| | | |
+-------+ +------------+
+------------+
| Advertizing|
| BC |
| |
+------------+
DAX桥接。
我喜欢在DAX中构建桥接表,而不是在M中。首先,它是用简单的代码完成的。其次,它为查询编辑器引入了某种整洁性,因为我只看到源表(而不是桥)
因此,为维度创建桥的方式如下所示:
#A =
DISTINCT (
UNION (
TOPN ( 0, ROW ( "A", "Apple" ) ),
DISTINCT ( Sales[A] ),
DISTINCT ( Budget[A] ),
DISTINCT ( Advertizing[A] )
)
)
AB的桥接器将是这样创建的a和B的笛卡尔乘积:
AB =
CROSSJOIN (
DISTINCT ( '#A'[A] ),
DISTINCT ( '#B'[B] ),
"A@B", COMBINEVALUES("@",'#A'[A], '#B'[B])
)
收到第一个答案后更新。
一旦悬赏开始,我不想编辑我问题的内容。在第一次回答之后,我意识到我的问题是偶然出现的等级制度,它分散了你对我想了解的内容的注意力。您可以忽略层次结构,将维度A、B、C视为独立维度
我想重点讨论如何构建一个星型模式,以防我们有许多独立的维度和一些表,比如带有连接维度的字典。例如,我们可以按地区和品牌定义销售预算,按产品颜色定义广告预算。我们是否应该建立一个具有所有维度的中心桥接表(ABC的笛卡尔积)?或者,中心桥接表是否应该具有多个维度的分支?在第二种情况下,根据OP的评论,我们将在2019年11月6日更新[AB]->[ABC]
AB
和ABC
这样的桥接表。对于这样的模型,如果存在多个事实表,建议使用多个事实表构建模型。只需在维度表和事实表之间建立直接的一对多关系,例如A->Sales
,B->Sales
,A->Budget
,以及B->Budget
。请注意,当您查看每个单独的事实表时,事实表和所有相关的维度表形成了一个星形模式
客户
可能属于多个类别
时,需要一个桥接表客户类别
。OP提供的场景不是桥接表的用例
接头尺寸表的缺点是
- 它需要额外的数据存储。如果
、A
、B
分别有100、100、1000行,则联合维度表将有1000万行。假设您在之后添加一个包含100行的新维度,那么维度行数将为10亿!这是不经济的C
- 它需要额外的计算。当我们想要通过
过滤A
时,引擎首先需要扫描联合维度表,以提取与Sales
的过滤值相匹配的行,这可能是大量的行,然后,引擎使用提取的联合维度表行中包含的关系键扫描A
事实表。只有当维度的大小非常小并且事实表非常大时,这才可能起作用。但在许多情况下,表现会令人绝望Sales
- 这是一种与业务数据无关的表示。我认为这是最大的缺点。在您的模型中,
仅在维度Budget
和A
的粒度中定义。想想属于B
实例的C
预算是毫无意义的。但是,为了在联合维度表和
之间建立关系,我们需要调整预算
,使其与预算
的特定实例相关C
[Total Budget] :=
IF (
NOT ( ISFILTERED ( 'C' ) ),
SUM ( 'Budget'[Amount] )
)
预算
应直接与A
和B
相关。因为在您的模型中,Budget
的粒度分别为A
和B
B->advisting
和C->advisting
顺便说一句,您的模型中实际上没有多对多关系。可能有多个
销售记录