关于多事实关系数据模型
多事实关系可让您构建具有多个基表的数据源。在数据模型中使用多个基表允许您在 Tableau 中执行多事实分析。
通过建立以基表为根的表树 ,您可以对具有不同概念域的数据结构进行建模,并使用它们的共享特征将它们连接起来。这种类型的分析通常被称为多事实分析、一致维度或共享维度。在 Tableau 中,我们将其称为多事实关系数据模型,因为您使用关系来构建它。多事实关系数据模型始终包含多个基表。基表是数据模型中最左边的表。有关如何确定使用哪些表作为基表的指导,请参见何时使用多事实关系模型。
相关程度
具有多个基表的数据模型对于数据片段如何彼此相关(或不相关)具有很大的灵活性。
注意:任何级别的相关性仅在具有多个基表的数据模型中相关。在多事实关系数据模型出现之前,要么所有内容都是相关的(在单一数据源内),要么什么都不相关(跨多个数据源混合)。
数据模型中的相关性
根据数据模型的结构,表是相关的、不相关的或共享的。在数据源中,表的相关性是一个常量。简要概述如下:
- 相关表 在同一个树中。
- 在 2024.2 之前,所有数据源都是由单个树组成的单基表数据源,而在单基表数据源中所有表都是相关的。
- 不相关的表在不同的树中。基表始终彼此不相关。恰好位于一个基表下游的表也与其他树中的表不相关。
- 共享表具有多个传入关系并属于多个树。
- 具有多个传入关系的表的下游表也被视为共享表。
分析过程中的相关性
字段可以是相关、不相关、尚未相关、模糊相关的,或者可以充当拼接字段。一组字段之间的相关性是根据数据模型的结构、哪些字段正在被积极使用(即,以胶囊形式位于功能区上)以及这些字段是维度还是度量来逐张确定的。
为了对来自多个表的字段进行可视化,Tableau 必须在后台执行联接来计算值。使用的联接类型取决于字段的相关性。简要概述如下:
- 在可视化项中使用相关字段时,维度是内部联接的,并且度量值按维度细分。
- 实际情况比这稍微复杂一些 — 可能需要在后台进行额外的连接,以确保不删除任何度量值。但在仅有维度的可视化项 中,相关维度是内部联接的,这是这里的主要概念。
- 这与单基表模型的行为相同。
- 在可视化项中使用不相关字段 时,维度是交叉联接的。度量值是表范围的(即,本地聚合为整个表的单个值)并且重复。
- 字段也可能尚未相关或模糊相关,这意味着对于活动字段的组合,有多种方法可以解决它们的表之间的关系。如果 Tableau 遇到不确定性,它会将字段视为不相关。
- 基于共享字段拼接 字段时,维度是外部联接的。度量值在任何可以细分的维度级别上进行聚合,并且可以重复。
- 拼接维度类似于数据混合中的链接字段。计算每对相关字段的结果,然后将不相关的值通过它们之间共享维度的共享值拼接在一起。
所有这些概念和定义将在本主题后面进行更详细的讨论。
在 Tableau 中,度量是聚合—它们聚合到由视图中的维度设置的粒度。因此,度量的值取决于维度的上下文。例如,“谷物食品盒的数量”取决于我们指的是总库存还是每个品牌的盒数。
维度通常是分类字段,例如国家/地区或品牌。在 Tableau 中,维度设置视图的粒度,即详细级别。我们通常希望根据某种类别的组合将数据分组为标记。我们用来构建视图的维度确定我们有多少个标记。
当使用没有维度的度量时,它被称为表范围。这意味着它的值是整个表的完全聚合值。一旦我们在可视化项中使用诸如品牌之类的维度,度量就会被更细化地细分。现在谷物食品盒的总数是按品牌计算的。
聚合是指数据的组合方式。Tableau 的默认聚合为 SUM。您可以将聚合更改为其他选项,其中包括“平均值”、“中值”、“不重复计数”、“最小值”等。粒度指的是度量的详细程度或细分程度 — 由维度控制。除非度量的粒度是行级(又称解聚),否则其值必须是聚合的。
示例
“谷物食品包装盒数量”的值是多少?
嗯,这取决于聚合类型和维度设置的粒度。
- 聚合
- 总和(或总计)
- 平均值
- 粒度:
- 表范围/完全聚合(示例中的蓝色条形)
- 按“Brand”(品牌)维度细分(示例中的彩色条形)
字段级相关性指标
有多种视觉线索可以帮助您了解分析中使用的字段的相关程度。
工作表上的相关性指标
- 不相关的图标:Tableau 使用不相关的图标 指明视图中的所有内容并非都是相关的。如果您在视图或“数据”窗格中的某个胶囊上看到不相关图标,则可以将鼠标悬停在该图标上获取更多信息。
- 相关图标 表示该字段正在将不相关的字段拼接在一起。
- 浅灰色字段名称:当字段名称与功能区上使用的任何字段不相关时,它们在“数据”窗格中显示为浅灰色文本。您仍然可以使用这些字段在该可视化项中进行分析,但是不相关的字段在分析中的评估方式与相关的字段不同。悬停时,这些字段也会显示不相关图标。
注意:在以前版本的 Tableau 中,浅灰色字段名称表示字段已隐藏,并且“显示隐藏字段”处于选中状态。隐藏的字段在显示时,现在用可点击的眼睛图标 表示。
相关性警告对话框
当在可视化项中一起使用不相关的字段时,Tableau 会显示一个警告对话框,让您知道这些字段不相关。每次添加不相关的字段时都会出现此警告,以防止可能影响性能的意外交叉联接。
- 如果要使用不相关的字段而不进行拼接,请单击“添加”以继续将字段添加到可视化项。
- 如果要拼接不相关的字段,最佳做法是在以其他方式不相关的字段之前显示拼接字段。如果拼接字段已经在使用中,则不会显示该对话框。有关拼接如何防止交叉联接的详细信息,请参见如何为相关性级别使用联接。
如果要添加多个字段或视图中已存在多个字段,对话框中将出现“详细信息”区域。展开该区域可查看有关所有正在使用的字段的相关性的更多信息,并确定不相关性问题的来源。
若要完全停止显示警告信息,请选择“不再显示”选项。您可以随时重新打开这些警告消息以重新启用它们:
- 在 Tableau Desktop 中,打开“帮助”菜单 >“设置和性能”>“重置忽略的消息”。
- 在浏览器中,清除缓存数据。例如,在 Chrome 中,打开 3 点式菜单>“删除浏览数据...”> 选择“缓存的图像和文件”>“删除数据”。
数据模型中的表级相关性
在具有多个基表的数据模型中,每个基表定义一组相关的表,并形成概念树。这些树必须至少通过一个共享表连接,以确保整体数据源是单一实体。
以前可以使用链接字段混合的两个数据源现在可以是具有两个树的单个数据源,通过包含这些公共字段的共享表连接。
提示:数据模型中表的关联方式会影响分析中字段的关联方式。在分析过程中回头参考“数据源”选项卡来查看表如何融入整体数据模型会很有用。
让我们使用此示例数据源来了解哪些表是相关、不相关或共享的。有两个树,一个树由基表 A 建立,另一个由基表 B 建立。
不相关的表
基表基本上是不相关的。同样,任何仅存在于单个树中的表都与其他树中的表不相关。
表 A 和表 X 不相关 | 表 B 和表 X 不相关 |
相关表
同一个树中的表被视为相关的。
表 A 和表 S 相关 | 表 B 和表 S 相关(通过表 A) |
共享表
共享表具有多个传入关系。这些表属于多个树并在它们之间共享。
表 S 和表 T 是共享的。
分析中的字段级相关性
字段之间的相关性是根据数据模型的结构、哪些字段正在被积极使用(即,哪些字段以胶囊形式位于可视化项上)以及这些字段是维度还是度量来逐张确定的。下一部分介绍了字段相关性如何影响可视化项的结果。
让我们使用相同的示例数据源来演练一下某些场景。每个字段的名称表明它来自哪个表,例如 FieldB 来自表 B。除非另有说明,否则字段可以是维度或度量。
相关字段
从高层次来看,当 Tableau 可以根据单个树内的关系路径清楚地确定如何一起评估字段时,字段就是相关的。
例如,FieldB(来自表 B)和 FieldS(来自表 S)是相关的。
不相关字段
从高层次来看,当字段不相关时,它们在任何情况下都是不相关的。这可能是因为这些字段来自不相关的表,例如使用来自两个基表的字段。在这种情况下,不同基表中的字段基本上不相关。
例如,FieldA 和 FieldX 不相关。
或者,可以将字段视为在某个时间点上不相关 - 例如在模糊相关或尚未相关的情况下。在大多数情况下,当字段在一个可视化项的上下文中不相关时,您可以依靠相关性指标来提醒您。
拼接维度
拼接是 Tableau 在分析过程中评估多事实数据模型中不相关表中的字段的方式。在可视化项中,使用共享表中的维度可以将原本不相关的字段拼接在一起,并允许在同一可视化项中同时评估它们。可以将其视为根据共享的维度将两个树的结果并列在一起。
举例来说,如果使用 FieldA 和 FieldX 构建可视化项,则这两个字段是不相关的。添加 DimensionS 会引入拼接字段。
- FieldA 和 DimensionS 一起评估。
- FieldX 和 DimensionS 一起评估。
- 这些中间结果是根据 DimensionS 的值汇总在一起的。
- FieldA 和 FieldX 现在已拼接。
提示:最佳做法是在导出不相关的字段之前,在可视化项中使用拼接字段。例如,先拖出 DimensionS,或者先拖出 FieldA,再拖出 DimensionS,再拖出 FieldX,而不是先拖出 FieldA,再拖出 FieldX,再拖出 DimensionS。首先添加拼接字段可确保 Tableau 始终知道如何评估关系,并避免因一起评估不相关的维度和交叉联接而产生的潜在性能问题。
拼接需要共享表中的维度在可视化项中处于活动状态。出于拼接目的,放置在“筛选器”功能区或“标记”卡上“工具提示”属性上的字段不被视为活动字段。
尚未相关的字段
字段还可以有多种相关但尚未相关的方式。当两个共享表(或下游共享表)之间可能存在多种关系时,就会发生这种情况。
假设有 FieldS 和 FieldT。它们的表通过基表 A 定义的树和基表 X 定义的树彼此相关。
在仅具有 FieldS 和 FieldT 的可视化项中,对于应该使用哪个树来关联它们,没有相关信息。如果没有其他信息,Tableau 就无法评估是通过基表 A 的树还是基表 B 的树来关联这些字段。
尽管存在多个潜在关系,但 FieldS 和 FieldT 被视为不相关。
这些可能相关但尚未相关的字段被评估为不相关字段,因为 Tableau 无法清楚地确定它们的关系路径。与只能拼接的真正不相关的字段不同,尚未相关的字段可以被解析并且字段可以直接相关。
模糊相关字段
字段也可能模糊相关。当共享表(或下游共享表)之间存在多个活动的可能关系时,就会发生这种情况。与尚未相关的字段(可被认为是低相关或欠相关)不同,模糊相关字段是超相关或过度相关的。
假设有 FieldS 和 FieldT。它们的表通过基表 A 定义的树和基表 X 定义的树彼此相关。
在具有 FieldA、FieldX、 FieldS 和 FieldT 的可视化项中,对于应该使用哪个树来关联它们,存在太多的信息。如果不修剪信息,Tableau 就无法评估是通过基表 A 的树还是基表 B 的树来关联这些字段。
尽管存在多个活跃关系,但 FieldS 和 FieldT 被视为不相关。
这些模糊相关字段被评估为不相关,因为 Tableau 无法清楚地确定它们的关系路径。与只能拼接的真正不相关的字段不同,模糊相关的字段可以被解析并且字段可以直接相关。
共享表中的度量
当从共享表使用维度时,它会将来自其不相关的上游表的字段拼接在一起。但是度量不能拼接,并且度量的值取决于其相关维度。
在具有 DimensionA 和 DimensionX 的可视化项中,这两个维度是不相关的。如果 MeasureS 是从 Table S 中取出的,则它与 DimensionA 和 DimensionX 的组合不相关。虽然它可以独立地与其中任一个相关,但它不能同时在同一个可视化项中与它们两者相关。
共享度量可被视为一种模糊性或过度相关性,并以相同的方式解析。
解析字段之间不明确的关系
每当不确定如何关联字段时,Tableau 不会做出任意决定,而是将它们视为不相关。通过澄清使用哪个树的不确定性来关联这些字段通常更好。
通过添加一个字段来确定使用哪个树来解析沿未相关的字段。通过移除字段来确定使用哪个树来解析模糊相关的字段。
示例:
解析尚未相关:添加一个字段
- 在 FieldS 和 FieldT 的可视化项中,将表 A、B 或 C 中的字段添加到可视化项会使基表 A 的树处于活动状态,并解决 FieldS 和 FieldT 之间的所需路径。
- 或者,使用表 X 中的字段将 FieldS 和 FieldT 之间的所需路径解析为基表 X 的树。
解析模糊相关:移除一个或多个字段
- 在 FieldA、FieldX、FieldS 和 FieldT 的可视化项中,移除 FieldX 只会使基表 A 的树处于活动状态,并解析 FieldS 和 FieldT 之间的所需路径。
- 或者,移除 FieldA 可通过基表 X 的树解析 FieldS 和 FieldT 之间的所需路径。
解析共享度量:移除一个或多个字段
- 在 DimensionA、DimensionX 和 MeasureS 的可视化项中,移除 DimensionX 只会使基表 A 的树处于活动状态,并解析 DimensionA 和 MeasureS 之间的所需路径。
- 或者,移除 DimensionA 可通过基表 X 的树解析 DimensionX 和 MeasureS 之间的所需路径。
尚未相关 | 模糊相关 | 相关性性解析为单一树 | |
通过基础表 A 相关 | 通过基表 X 相关 | ||
解析不确定性类似于使用 FIXED 详细级别 (LOD) 表达式。在 FIXED LOD 表达式中,您可以通过定义维度声明来告诉 Tableau 要聚合到哪个详细级别。通过改变可视化项的结构使只有一个树处于活动状态,可以解析不确定性,从而告诉 Tableau 可以考虑哪些关系路径来执行分析。
拼接与解析不确定性
拼接和解析不确定性都是处理不相关性的方法,但它们的结果不同:
拼接 | 解析不确定性 |
基于共享属性并列不相关的字段 | 当有多个选项(模糊性或共享度量)时缩小要使用的关系路径,或当没有关系路径(尚不相关)时建立关系路径。 |
使用多基表逻辑来计算结果 | 使用单基表逻辑来计算结果 |
分析涉及不相关的表 | 分析涉及共享表 |
如何为相关性级别使用联接
确定字段级相关性后,Tableau 必须评估结果以创建实际的可视化项。用于计算可视化项中显示的值的查询依赖于联接。字段是相关、不相关还是拼接对执行的联接有不同的影响。请记住,在此上下文中,模糊相关和尚未相关的字段将被视为不相关。
为了解释相关性和联接,本部分将介绍表及其字段以及这些字段中的值。假设有以下具有两个基表(“Classes”(班级)和“Clubs”(俱乐部))和一个共享表(“Students”(学生))的数据模型。
Classes(班级) | Clubs(俱乐部) | Students(学生) |
字段:
| 字段:
| 字段:
|
这个非常简单的模型说明了如何计算多事实关系数据模型的高级联接逻辑。有关基于关系构建的单基表数据模型中使用的联接基础知识的详细信息,请参见分析如何适用于使用关系的多表数据源。
对于这个三表数据模型,将其设置为单基表模型(如班级-学生-俱乐部或俱乐部-学生-班级)或以学生作为基表可能会很有吸引力。通常,多事实关系数据模型适用于特定类型的数据架构或分析场景。如果您的数据模型具有最适合多事实关系数据模型的特征,通过这种方式进行设置可以使您的基表在概念上保持不相关。但是,如果您的数据不需要这种类型的结构,则单基表模型会更易于使用。
在这种特定情况下,这些表、数据或模型并不真正需要多个基表。我们使用好像模型作为示例,以使其保持简单,从而可以将重点放在联接逻辑上。或者您可以想象还有另一个相关的表(“Rooms”(房间)),我们只是忽略它以避免使讨论过于复杂。
然而,作为最佳实践,仅当您的数据需要时才使用多事实关系模型。
相关维度使用内部联接
相关维度是内部联接的。内部联接会删除两个表之间不共享的任何维度值。
- Tableau 使用额外的逻辑来确保度量值不会丢失。本部分仅使用维度来演示 Tableau 如何将内部联接应用于相关维度的基础知识。
以下示例显示相关维度如何仅返回数据中存在的行。由于没有学生参加“Alarm Calls 101”(报警电话 101)课程,因此结果中不存在该课程。Cardinal 和 Jay 没有参加任何课程,因此他们没有出现在结果中。
不相关的维度使用交叉联接
不相关的维度(单独的、没有拼接维度)是交叉联接的。
在交叉联接中,一个维度中的每个值都会与另一个维度中的每个值进行组合,即使结果组合实际上并不存在于数据中。在此示例中,交叉联接为“Classes”(班级)和“Clubs”(俱乐部)的每种可能组合添加一行。
认识到分析中何时发生交叉联接非常重要。尽管在交叉联接的结果表中有一行“高级歌曲 + 急救”,但实际上没有学生参与这种活动组合(我们将在下一部分的拼接示例中看到这一点的证明)。
为什么认识到并非所有交叉联接接结果都基于数据很重要?想象一下,您试图制定课程和俱乐部的时间表,以免任何学生出现冲突情况。高级歌曲和急救课上没有学生,所以您可以忽略这个结果,同时安排该课程和俱乐部。交叉联接并不代表数据中实际存在的值的组合。
此外,当基数较高(大量唯一值)时,交叉联接可能会影响性能。想象一下将每个电话号码与联系人中的每个电子邮件地址交叉联接的情况。这会造成组合的巨大爆炸式增长,并且可能产生高昂的成本。
拼接维度使用外部联接
不相关的维度(在存在拼接维度的情况下)是外部联接的。
在此示例中,“Classes”(班级)表和“Clubs”(俱乐部)表都与共享的“Students”(学生)表相关,但彼此不相关,因此“Classes”(班级)和“Clubs”(俱乐部)字段不相关。添加“Students”(学生)维度可以让 Tableau 知道在分析中应该将“Classes”(班级)中的哪些值与“Clubs”(俱乐部)中的哪些值并列。我们称之为外部联接行为拼接。
拼接与数据混合的相似之处在于,将中间结果重新组合在一起以获得总体结果。然而,与混合不同的是,拼接是外部联接,而不是左联接,并且不会从任何一侧删除值。当所有数据源都为一个时,就没有主要数据源或次要数据源的概念,因此两个不相关的字段都具有同等的优先级。
中间结果是外部联接的
拼接字段的外部联接中包含什么?依次对每个不相关字段和拼接字段计算直接内部联接,然后根据拼接维度的值对这些中间结果进行外部联接。
示例
“Students”(学生)和“Classes”(班级)的内部联接...
...以及“Students”(学生)和“Club”(俱乐部)的内部联接...
...然后在“Students”(学生)上进行外部联接。
保留度量的附加联接
除了维度的联接逻辑之外,度量还可以引入额外的联接。当 Tableau 首次引入关系时, 核心原则之一是度量值不会丢失。这也在多事实关系数据模型中得到维护。
基本细节如下:
- 度量值仅按相关维度细分。
- 对于不相关的维度,度量值会重复。
- 如果有相关的度量值与之关联,则可能会返回在仅有维度的可视化项中删除的维度值。
注意:请记住,度量是聚合 — 它们是在可视化项中的维度组合所设置的详细级别(粒度)上计算的。这称为度量按维度细分。当使用没有任何维度的度量时,它被称为 表范围的度量。这意味着该度量的值是完全聚合的值。一旦我们在可视化项中使用维度,度量就会根据维度值更细化地细分。因此,分析中度量的值取决于维度的上下文。
相关度量
考虑在相关维度(“Students”(学生)和“Classes”(班级))上进行内部联接所返回的维度值子集有三个学生值,分别是雀科、知更鸟和麻雀;以及三个班级值,分别是高级歌曲、筑巢基础和雏鸟飞行。
如果我们从“Classes”(班级)表添加“Length”(长度)度量,我们会看到所有四个班级都显示出来,并且有一个空值表示“Students”(学生)。每个班级“Length”(长度)显示在“Classes”(班级)级别。
如果我们改为通过“Students”(学生)表添加 “Age”(年龄)度量,我们看到显示了所有五名学生,并且班级有两个空值。结果保留了每个学生,即使他们不在同一个班级。每个学生“Age”(年龄)显示在“Students”(学生)级别。
不相关的度量
对于不相关的维度值,度量值会重复。
如果我们查看“Classes”(班级)表中的“Length”(长度)度量和不相关的“Club”(俱乐部)维度,度量是表范围的,并在“Club”(俱乐部)的所有维度值中重复。
在存在拼接维度的情况下,度量既可以分解,也可以重复。
在这里,度量“Age”(年龄) 来自“Students”(学生)表,并细分到学生级别。每次学生根据“Classes”(班级)和 “Club”(俱乐部)的维度重复时,“Age”(年龄)值会重复。
疑难解答
使用多事实关系数据模型时的注意事项
针对每个表的数据提取筛选器
多事实关系数据模型数据提取的所有数据提取筛选器都是针对每个表的(而非普遍的)。因此,实时连接和数据提取连接之间的筛选结果可能会有所不同。
行级计算
行级计算只能引用共享同一上游基表的字段。也就是说,不能跨树执行行级计算。
合并字段
合并字段中的所有字段必须共享一个上游表。也就是说,您不能使用不同树中的字段创建合并字段。
集
只能使用涉及共享相同上游基表的字段的定义来创建集。但是,在可视化项中,当标记由与用于定义集的字段不相关的字段定义时,可以从标记中使用“添加到集”选项。如果选择“添加到集”,Tableau 会仅将相关字段添加到集定义中。这与单基表数据源中的“添加到集”的行为不同,“添加到集”会添加定义标记的所有内容。
验证 INCLUDE 详细级别表达式
不能跨不相关的字段评估 INCLUDE LOD 表达式。由于字段之间的相关性是按工作表进行评估的,因此“数据”窗格或计算编辑器中可能存在有效的 LOD 表达式,但在特定可视化项的上下文中(存在不相关的维度)可能会变得无效。发生这种情况时,LOD 胶囊将变成红色。您可以更新 LOD 表达式以移除不相关的字段冲突、更改可视化项的结构,或从可视化项中移除 LOD 表达式。
更新已发布数据源
作为最佳做法,如果您计划将现有已发布数据源修改为多事实关系数据模型(但并非所有连接的工作簿都需要新的数据模型),请创建现有已发布数据源的副本。除非所有工作簿都需要新表,否则不要更新数据源的现有版本。将修改后的数据源发布为新数据源并从中创建新的工作簿。当现有工作簿不需要该功能时,这将阻止其转换为使用 VDS 而不是数据服务器,从而避免潜在的性能影响。
已解决的问题
已解决的问题 | 修复截止日期 |
数据提取 本地数据源(在工作簿中):尝试提取多事实关系数据源将出现“No such table”(没有这样的表)错误。 已发布数据源:提取已发布的多事实关系数据源似乎成功,但字段值可以交换。 |
如果您在 Tableau Desktop 或 Tableau Server 中仍然看到这些问题,请升级到 2024 年 7 月 24 日或更高版本。 |
EXCLUDE 详细级别表达式 仅当存在不相关字段时才应验证 INCLUDE LOD。然而,在相同条件下,EXCLUDE LOD 也可能被错误地标记为无效。 | |
嵌套用户计算 嵌套用户计算在具有多事实关系数据模型的已发布数据源中不可用。 |
2024.2 中的已知问题
具有多个“标记”卡的相关性指标
当在“行”功能区或“列”功能区上使用多个度量构建可视化项时,每个度量都会获得自己的“标记”卡。用于确定相关性指标(不相关图标、工具提示中的文本以及相关性警告对话框)的逻辑可能不会给出预期的结果,具体取决于打开的“标记”卡。但是,可视化项本身是根据每对字段的相关性正确计算的。我们已经计划修复此行为。
BatchQueryProcessor
必须启用 BatchQueryProcessor 才能支持多事实关系数据模型。这是预期行为,目前没有计划修复。
Tableau Pulse
Pulse 可能不适用于多事实关系数据模型。您可能无法创建指标定义,或者创建的任何指标可能都是空白的。这不是预期的行为,但目前还没有计划修复。