【上篇】99% 的人都忽略了!强大模型的崛起秘密在于设置正确关系书接上文,带着上文的知识储备,接下来再给大家介绍在Smartbi中模型关系创建的常用操作、设置模型关系的基础准则并举例说明各种关系如何使用,同时在文章最后也有开展一个讨论活动,欢迎同学们踊跃参与!话不多说,我们开始进入正题。
创建数据模型关系的常用操作
根据上文了解了模型的关系之后,给大家简单概括一下创建模型关系过程中常用的基本操作,主要有:
1、在加载期间自动检测关系:当表加入到数据模型中,会自动创建表关系

2、点击”检测关系“按钮:会检测没有关联关系的表有无关联关系,有的话会自动创建,没有的话就不会创建。

3、编辑/删除关系: 可以通过选中关系线条右键菜单进行编辑、删除操作

4、关闭自动检测关系:如果后面加入的表不想要自动创建关系,可以关闭自动检测表关系。

5、可以通过表的右键菜单“新建关系”、或者拖动圆圈到另一个表中创建表关系。

数据模型关系设置准则
在通读了前文的各种关系逻辑之后,有些同学是不是还有些昏头转向不知道从何下手,没关系!当你一时无法彻底梳理清楚复杂表关系时,可以先做到以下两步初步创建好模型:
- 保持基数仅限于:多对一或一对多。
- 保持筛选方向仅限于:单向。
这样就将一团复杂简化到只有一条原则的状况,不会把自己搞的稀里糊涂。
举些例子
了解了模型的关系之后,接下来给几个例子来加深大家理解正确设置模型关系。
示例1、一对多
【场景】我们可以先梳理下在《欢迎来到被数据模型统治的Smartbi》结尾中提前留下的题目场景“如何筛选销售量大于100的产品类别有哪些?”,同学们是否已经轻松解答了呀,以下是思路过程解析:
【数据】下面有4个表,产品类别表、产品表、销售明细表、年份表

【关系梳理】根据主键外键标识可以看出产品类别表关联到 产品表,产品表关联到 销售明细表,年份表也关联到 销售明细表;所有的关系均为一对多。
【模型关系】在Smartbi数据模型中,由于默认开启了自动检测表关系,这几张表会自动根据同别名+同数据类型的字段进行关联,生成关系连线如下:

【分析一下】
销售量是事实表Sales的指标,产品类型是维表Category中的一个维度属性,根据关联关系名字的子图是 Category → Product → Sales,可直接形成一条完整的筛选方向,无需额外开启双向筛选。
【仪表盘】制作步骤:
1、在仪表盘选择产品类别字段
2、再拖入销售量作为筛选条件,并且设置操作符
3、切换数据可以看到能正常筛选产品类别。


【提炼知识点】从此示例可知:事实表的指标筛选维度表的维度,不需要开启双向筛选也能正常筛选到数据!
示例2、一对多-双向筛选
【场景】还是用示例1的数据,假设想要“计算一各个年份卖了多少个产品类别”?会怎么做呢?
【关系梳理】
首先基于前面构建好的基数都是一对多,并且是单向筛选的数据模型,在仪表盘中拖入汇总表,选择年份字段以及通过复制转度量创建产品类别个数。
刷新数据发现都是2(异常数据)

我们回到数据模型可以看到,年份表,无法到达产品类别表,也就是年份表无法筛选产品类别表。

那么要让年份表筛选产品类别表需要在产品表与销售明细表中开启双向筛选,也要在产品表与产品类别表中开启双向筛选。这样年份表才能指向到产品类别表。
【模型关系】最终生成的数据模型

【仪表盘】开启双向筛选之后,我们再来刷新一下仪表盘数据

【提炼知识点】当需要对维度表进行汇总时,比如想要计算维度表中某个维度的数量,此时需根据模型关系链路梳理是否需要开启双向筛选!
示例3、多对多
【场景】
查询各个产品名称的目标销量、实际销量;
根据年月日查询各个产品下的实际销量、目标销量以及目标销量的前期值
【数据】销售表、目标表中多条日期和产品名称记录相关联

【关系梳理】采用星型架构设计原则,需要提炼出两个维表,实现与事实表依然采用一对多关联。
- 产品维:通过SQL查询在销售表、目标表中提取唯一的产品名称公共维度;

日期维:在数据模型中选择生成日期表,来创建公共日期维

接着把不必要的字段或者表都隐藏并且创建时间维度以便于后面分析

【模型关系】最终生成的数据模型

【仪表盘】

【提炼知识点】多对多的场景可以通过各种手段添加维表实现 维表与事实表通过一对多关系关联。
示例4:假设引用完整性
那细心的小伙伴可能也发现了,编辑关系界面中最后还有一个设置项“假设引用完整性”,但其实很多人不知道它的作用是什么,接下来也以一个示例的形式来说明。
首先明确,假设引用完整性并不是Smartbi自创的词汇,该词在数据库中也有相关概念。
假设引用完整性是指假设一个表中的值保证另一个表中具有匹配项。简单来说,当两张表的关系勾选了假设引用关系完整性,代表一方的数据一定包含多方的数据,那么多方的数据一定不能为空或null。
假设引用完整性是直连性能优化方面的措施,因此只在直连模式生效。如果两个表之间的数据满足一方的所有数据的多方中都存在,那么此时两表left join 和inner join 是相等的,即满足假设引用完整性,那么在勾选上“假设引用完整性”后,两表之间的关联查询则会用inner join,此关联关系在很多数据库的查询性能会更优。
如两表之间的数据无法满足假设引用完整性,则此时勾选假设引用完整性结果会不正确。

下面我们来看一个假设引用完整性的示例

看图,有2张表,产品表和订单表。
- 产品表中有产品ID包含Product A、B、C
- 订单表中也有产品ID包含Product A、B、C
可以看出来产品表中的值在订单表可以匹配的上。
我们看一下创建好的数据模型并且创建仪表盘“从产品ID的角度”看销售额大小
在数据模型中可以看到2个表的产品ID都是一样的,对比有无勾选“假设引用完整性”

去创建仪表盘,勾选产品ID以及数量字段

再去系统监控查看对应的执行SQL语句,可以看到勾选了“假设引用完整性”时执行SQL是inner join

以上就是本次关于正确设置模型关系的介绍了,期待大家在后续的使用中能够轻松做出正确的关系设置,创建出更多丰富的数据模型。带着这些基础知识点,下期我们将继续带来“在构建数据模型中踩过的坑”的经验分享,通过一些错误示例来加深大家对正确构建数据模型的理解。不要走开,马上回来!
大家平时在创建数据模型过程中是否有踩到一些坑,各位可以前往评论区尽情挥洒泪水了!小编会选取精彩的回复,奖励麦豆哦~

如果这篇文章对你有所帮助,请不要吝啬你的分享按钮,让更多人受益吧!也欢迎大家在评论区热烈讨论!
|