在数据模型中进行表/查询关联时,支持对某个数据连接的多个表进行关联,也支持对多个数据连接中的表进行关联。
1、数据模型支持自动检测关系,也支持手动创建关系、手动检测关系。 2、数据模型默认开启 自动检测关系 ,如没有开启:需要在运维设置/ 系统设置 / 高级选项 设置 OLAP_QUERY_AUTO_ADD_CHECK_LINK=true,在加载表或者查询时才会自动检测关系。 3、如开启了自动检测关系:假设自动检测没检测出来,用户手动设置关系不正确时,会提示关系无效,但目前未强制更正;检测关系的原理就是利用建立关系的字段在表中是否重复,会真实查数据库,部分数据库慢可关闭此检测。 4、基数 暂不支持 多对多。 5、假设引用关系完整性,仅在数据模型是直连模式生效,抽取模式不生效。 6、在V11 版本去掉了 一对一(内连接)、一对一(外连接),只有 一对一;如果是旧资源升级: |
以"事实表"为中心,通过表或者查询的关系建立一个子图,子图就是围绕事实表型形模型或者扩展的星型模型; 如果在报表层次查看2个事实表的数据,并且通过勾选的字段无法找到关联关系(即不在同一个查询路径上),会提示:无法正常显示数据,因为无法确定勾选字段之间的关系路径,它们可能不在同一个关系路径上。 |
1、数据模型设置的关系会应用于模型表列的筛选器传播到其他表或查询, 只要有关系路径可循,筛选器就会进行传播,这可能涉及传播到多个表/查询;
关系路径是确定性的,这意味着筛选器始终以相同的方式传播,不会随机变化。
2、在下图示例中,模型由四个表组成:"Category"、"Product"、"Year" 和 "Sales"; "Category" 表关联到 ”Product“ 表,而 ”Product“ 表关联到 “Sales”表, ”Year“ 表也关联到 “Sales” 表, 所有关系均为 一对多.
3、关系属性:
4、关系支持:手动创建关系、加载期间自动检测、以及手动检测。
数据模型支持手动创建关系。
以产品自带的 “产品表”、“订单表”、“产品类别表”等创建订单模型为示例进行说明。
为了更好的说明,先在运维设置/系统选项/高级设置关闭自动检测表关系的设置项: OLAP_QUERY_AUTO_ADD_CHECK_LINK=false 或者把模型的 自动检测表关系 禁用。
具体操作步骤如下:
1、创建数据模型,并加入 “产品表”、“订单表”、“产品类别表“等表。
2、设置 ”订单表“与”订单明细表“的关系,选中”订单表“ 再右键菜单 新建关系或者通过 连线 到另外一个表/查询,会出现 编辑关系对话框。
选项 | 内容 |
---|---|
关系 |
|
条件 | 默认 等于,支持等于、不等于、大于等于、小于、小于等于;如果是抽取模式,并且缓存库是ClickHouse,则不支持 等于、不等于、大于等于、小于、小于等于 条件。 |
基数 |
|
假设引用关系完整性 | 该设置项仅对 直连 模式生效。 详情可查看本篇章节 假设引用关系完整性 。 |
方式1:
方式2:
3、根据步骤2设置好各个表、查询的关系,最终效果如下,构建了一个 星型模型:
如果发现关系或者基数设置的不对可以对其进行 删除 或 编辑:选中连线,再右键菜单删除/编辑。或者选中连线,按delete键。
当系统没有开启自动识别字段关系时,可以点击 检测关系 检测各个表/查询之间的关联关系。规则与第2章 在加载期间自动检测 一致。
1、“一对多”和“多对一”基数选项基本相同,并且它们也是最常见的基数类型:
2、在数据模型中,”订单表“和”订单明细表“基数关系如果是 一对多,代表”订单表“中用于和”订单明细表“建立关系的字段值OrderID,在”订单明细表“是唯一的; ”订单表“中用于建立与”订单明细表“关系的字段值,在”订单明细表“会有多条记录匹配。
3、站在业务角度,数据模型中的基数关系(一对一、一对多/多对一),描述的是真实业务数据之间联系,能反应真实世界对应业务实体之间的关联关系,如一个顾客可以有多笔订单,一个订单可能购买多个产品,一个订单也可能分拆多个快递单等等,对应到数据模型就是:
1、由于示例使用了 业务表 进行分析,在复现示例时,可以把数据先导入到模型中,详细请参考:导入文件数据。 2、示例下载数据:车牌与车俩.xls。 |
一对一 定义:一个表中共享字段的每个值最多与另一个表中共享字段中的一个值相关;缩写:1:1。
示例:每辆车都有自己的车牌,车牌是特定于一辆汽车的,汽车与车牌的关系是 一对一 的,如下图所示:
具体操作步骤如下:
1、把数据导入到模型中,并且设置好关系、基数:
2、保存模型并去建仪表盘,拖入”车牌“、"汽车识别号", 效果如下图:请注意,即使汽车未注册或车牌号尚未分配给汽车,也同样会查询出来:
当连接到使用 直连 的数据源时,你可以使用“假设引用完整性”选项对数据源运行更高效的查询。
设置“假设引用完整性”,使数据源上的查询使用 INNER JOIN 语句而不是 OUTER JOIN 语句,从而提高查询效率。
仅在连接到使用 直连 的数据时才可用。 若要使“假设引用完整性”正常工作,必须满足以下要求:
在这种情况下,左表/查询 列是一对多关系中的“多”,或是一对一关系中第一个表中的列。
1、创建数据模型并把产品自带的northwind数据库的“产品表(product)”、“订单明细表(OrderDetail )”等加入到模型中。
2、下图显示了 OrderDetail 表和 Products 表,引用完整性存在于 OrderDetail [ProductID] 和 Products[ProductID] 之间。 OrderDetail 表中的 [ProductID] 列始终不能为 Null ,所有值也会出现在 Products 表中。 在这种情况下,应设置“假设引用完整性”以获得更高效的查询。
3、如下图所示,请注意 Orders[DepotID] 和 Depots[DepotID] 之间不存在引用完整性,因为某些 Orders 的 DepotID 为 Null 。 在这种情况下, 不应设置“假设引用完整性”
4、如下图所示,请注意 Orders[DepotID] 和 Depots[DepotID] 之间不存在引用完整性,因为某些 Orders 的 DepotID 为 Null 。 在这种情况下, 不应设置“假设引用完整性”
1、勾选该设置项: 取数的SQL 是inner join; 没有勾选: A left join B,B left join A,两个再加起来,是full join的效果。
2、如果在抽取模式勾选了该选项,依然是不生效。
3、如果错误地设置了假设引用完整性,会发生什么?如果在数据中有引用完整性问题时设置“假设引用完整性”,该设置不会导致错误。 但是,可能会导致数据不一致。
使用数据模型的布局,可以创建仅包含模型中部分表或查询的关系图,可以帮助你提供你想要使用的表的更清晰视图,并让你能够更为轻松地使用复杂数据集。
具体操作如下:
1、以产品自带的northwind数据库的“产品表”、“订单表”等构建“订单模型”。
2、然后在创建单独的关系视图,也可以叫做布局