1 1 概述
在数据模型中进行表/查询关联时,支持对某个数据连接的多个表进行关联,也支持对多个数据连接中的表进行关联。
信息 | ||
---|---|---|
| ||
1、数据模型支持自动检测关系,也支持手动创建关系、手动检测关系。 2、数据模型默认开启 自动检测关系 ,如没有开启:需要在运维设置/ 系统设置 / 高级选项 设置 OLAP_QUERY_AUTO_ADD_CHECK_LINK=true,在加载表或者模型时才会自动检测关系。 3、如开启了自动检测关系,用户手动设置关系不正确时,会提示关系无效,但目前未强制更正,检测关系的原理就是利用建立关系的字段在表中是否重复,会真实查数据库,部分数据库慢可关闭此检测。 4、基数 暂不支持 多对多。 5、引用关系完整性假设引用关系完整性,仅在数据模型是直连模式生效,抽取模式不生效。 |
2 关系
...
- 模型关系可将一个表/查询中的一列关联到另一个表/查询中的一列。
- 无法将同一表中的一列关联到另一列。 无法将同一表中的一列关联到另一列。
- 无法使用数据模型创建父子关系。
4、关系支持:手动创建关系、加载期间自动检测、以及手动检测。
...
以产品自带的 “产品表”、“订单表”、“产品类别表”等创建订单模型为示例进行说明,为了更好的说明,先关闭自动检测表关系的设置项: OLAP_QUERY_AUTO_ADD_CHECK_LINK=false。false 或者把模型的 自动检测表关系 禁用。
具体操作步骤如下:
1、创建数据模型,并加入 “产品表”、“订单表”、“产品类别表“等表。
...
选项 | 内容 |
---|---|
关系 |
|
条件 | 默认 等于,支持等于、不等于、大于等于、小于、小于等于;如果是抽取模式,并且缓存库是ClickHouse,则不支持 等于、不等于、大于等于、小于、小于等于 条件。 |
基数 |
|
假设引用关系完整性 | 该设置项仅对 直连 模式生效。 详情可查看本篇章节 假设引用关系完整性 。 |
3、根据步骤2设置好各个表、查询的关系,并且构建数据模型。
4、保存数据模型,可以查看到已经设置好关系的模型:
3、根据步骤2设置好各个表、查询的关系,最终效果如下,构建了一个 星型模型:
2.3 在加载期间自动检测
- 开启自动检测关系:需要在运维设置/ 系统设置 / 高级选项 设置 OLAP_QUERY_AUTO_ADD_CHECK_LINK=true,在加载表或者模型时才会自动检测关系。
- 不管是直连还是抽取模式,如果数据模型同时加载两个或多个表/查询时,Smartbi将尝试为你查找并创建关系, “关系”、 “基数” 会根据规则自动创建关系。如果无法以高置信度确定存在得匹配项,则不会创建关系。但是仍可使用 新建关系 对话框来手动创建或者编辑关系。
- 如果 ”自动检测表关系“是禁用状态,则该模型加载表或查询时,不会自动检测关系,需要手工创建或者使用工具栏的”自动检测“创建关系。
...
设置“假设引用完整性”,使数据源上的查询使用 INNER JOIN 语句而不是 OUTER JOIN 语句,从而提高查询效率。
3.1 使用假设引用关系完整性的前提条件
这是一项高级设置,仅在连接到使用 DirectQuery 仅在连接到使用 直连 的数据时才可用。 若要使“假设引用完整性”正常工作,必须满足以下要求:
- 关系中 From 列中的数据始终不能为 Null 或 空白
- From 列中的每个值在 To 列中都有对应的值
...
- 左表/查询 列中的数据始终不能为 Null 或 空白。
- 左表/查询 列中的每个值在 右表/查询 列中都有对应的值。
在这种情况下,左表/查询 列是一对多关系中的“多”,或是一对一关系中第一个表中的列。
...
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 。 在这种情况下, 不应设置“假设引用完整性”
3.3 设置假设引用完整性
勾选该设置项,将对数据验证此设置,以确保没有 Null 或不匹配的行。 但是,在值的数量非常大的情况下,验证不能保证没有引用完整性问题。
如果错误地设置了假设引用完整性,会发生什么?如果在数据中有引用完整性问题时设置“假设引用完整性”,该设置不会导致错误。 但是,可能会导致数据明显不一致。