数据模型管理
数据模型以维度建模做为理论基础,提供了面向分析场景建模的能力。数据模型(关联关系模型)是以某个数据集为中心,通过多表关联(join)、合并(union)的方式,构建数据集之间网状关系的结构化体系,数据模型是数据集之间关系的载体。
在衡石中定义的数据模型,数据集是维度表或者事实表是根据它在模型中所扮演的角色确定的,没有显示的标注标记数据集是维度表或者事实表。数据模型的中心数据集被称为模型表,数据模型中的其它数据集被称为从表。在下图的数据模型中,“24年销售数据表”是模型表,其它三个数据集都是从表。
新建关联关系
在数据模型页面,选中左侧数据集列表的一个数据集,右侧就展示出了该模型表为中心的数据模型。把左侧列表中的数据集拖到数据模型的节点上,弹出新建关系
弹窗,从而定义这个关联关系的属性。
- ① 关系涉及的数据集:它只能涉及到两个数据集,上面的数据集是左表,下面的数据集是右表。
- ② 关联条件:描述两个数据集关联的条件,关联条件可以是简单条件,也可以是表达式条件。
- ③ 过滤条件:过滤条件是指在关联条件的基础上,再添加的过滤条件。数据集按照关联条件关联之后,再根据过滤条件进行筛选。过滤条件可以是简单条件,也可以是表达式条件。
- ④ 关联类型:左表和右表的关联类型,与数据库的关联类型对应,有左连接、内连接、右连接、全连接。
- ⑤ 关联基数:左表和右表的关联基数,描述两个表的数据特征,有一对一、一对多、多对一、多对多。
- ⑥ 生效机制:模型的生效机制包括按需关联和始终关联。
- ⑦ 启用环形模型:有独立关联关系和共享关联关系两种。
编辑关联关系
在数据模型页面,选中左侧数据集列表的一个数据集,右侧就展示出了该模型表为中心的数据模型,右侧便是模型的展示和编辑区域。点击数据集连线中间的图标,有编辑关系
菜单;或者点击数据集右上角三点菜单,也有编辑关系
菜单。点击上述任何一个编辑关系的菜单,就会进入编辑关系的弹窗,属性介绍同上新建关联关系。
删除关联关系
在数据模型页面,选中左侧数据集列表的一个数据集,右侧就展示出了该模型表为中心的数据模型,右侧便是模型的展示和编辑区域。点击数据集连线中间的图标,有删除关系
菜单;或者点击数据集右上角三点菜单,也有删除关系
菜单。删除单个关系时,与删除的关联表关联的其他关系也会被删除。也就是说,数据模型中不会有独立于模型表的关系,任何一个数据集都会与模型表相关联。
重命名关联关系
在数据模型中,从表在新建的时候,默认名字和从表的基础数据集一致。用户可以根据业务需求修改从表的名称,它不会影响从表使用的基础数据集的名称。从表的数据集名称会影响数据集过滤条件是否生效,规则是:能够在本次计算起作用的过滤条件,需要它使用的数据集 id 和从表数据集的基础数据集 id 一致,并且它使用的数据集名称和从表数据集的名称一致。
新建合并关系
数据模型中每个数据集都支持追加数据。点击模型中每个节点右上角三点菜单中的上下合并。此时左侧的数据集列表呈现勾选状态,右侧展示当前数据集的字段信息。 从左侧数据集列表中选中待追加的数据集,点击确定后数据追加成功,将勾选的数据集数据追加到节点的数据集中。
提示
追加原则如下:
- 自动按节点字段名称对齐,第一个为基础节点数据集,其它数据集与它的字段名称相同时数据追加到一起,其它数据集与它的字段名称不同时会被忽略并且不会在当前模型中有体现。
- 基础节点数据集的用户新增字段,追加后依然是新增字段,如果追加进来的字段名称一样,该字段为实体列时被忽略。
- 隐藏列可以参与追加。
编辑合并关系
同上述新建合并关系的步骤,勾选或者取消勾选参与到合并的数据集即可。
启用/停用维度去重
在没有公共维度表的情况下,如果多表之间的数据是多对多关系时,直接关联建立模型后,数据可能会发生膨胀,生成重复数据,影响后期数据的挖掘和分析。这种情况下可以使用维度去重功能,去除重复数据,消除数据膨胀。点击模型表右上角的三点菜单,有“启用维度去重”的菜单。点击“启用维度去重”,表示开启此功能;点击“停用维度去重”,表示关闭此功能。
下面以订单表和广告投放表两个数据集举例,演示如何使用维度去重功能消除数据膨胀。
订单表和广告投放表的原始数据如下。
直接使用日期字段进行多对多的关联并作图分析,那么得到的关联关系和图形的数据会膨胀,总广告投放支出只有4000的情况下,聚合结果为6000。
当开启维度去重之后,那么模型就可以根据用户的意图,算出订单对应的日期的广告支出实际上只有3000。
提示
维度去重功能根据数据分析的需要支持开启和关闭。 在使用维度去重功能时,要清楚哪些数据发生了膨胀,消除的是哪些膨胀数据。
预览数据
点击数据模型区域右下方的预览数据
,可以即时预览关联模型生效后的数据:
数据模型中的数据集来源
正常情况下,数据模型中的所有数据集都需要来自同一个数据连接,只支持同源数据集的关联或者合并。如果要对异构数据集建模,可以参考以下解决方案:
- 在支持导入引擎功能的前提下,把所有的数据集导入引擎,再构建数据模型。这种情况下,模型的所有计算都发生在引擎所配置的数仓里。
- 如果只有少量数据集来自于异构数据源,并且这些数据集的数据量小于500行,可以把它们设置为公共字典表,再与其它数据集构建数据模型。这种情况下, 模型的计算发生在模型表的来源数据连接。公共字典表不能做为模型表。
数据模型中使用同一个数据集多次
在一个数据模型中使用同一个数据集多次,有两个使用场景,一个是做为独立关联关系出现多次,一个是做为共享关联关系出现。
独立关联关系的场景
在一个数据模型中,同一个数据集被拖入多次并且关系的配置是独立关联关系,这个数据集在该模型中会扮演多种角色,每个关系是不同的分析角度。同一数据集拖入多次,后续拖入时系统会在数据名称上自动加上(1)、(2),需要用户根据业务需求重命名从表。 下图的场景要分析公司的组织架构,员工信息
数据集被拖入多次,模型表员工信息
描述所有员工的基础信息,一级经理
描述一级经理的信息,二级经理
描述二级经理的信息,一级经理
和二级经理
这两个从表的基础数据集都是员工信息
。
共享关联关系的场景
在一个数据模型中,同一个数据集被拖入多次并且关系的配置是共享关联关系,通常用于多维度表多事实表的场景中,这种配置会让模型的连线成环,也称之为环形模型。环形模型的例子参照启用环形模型。操作步骤为:
- 拖入数据集做为从表,并且把关系的配置设置为共享关联关系。
- 再次拖入该数据集,并且把关系的配置设置为共享关联关系,系统在右侧模型展示界面会把两次拖入的从表合并为一个节点。
聚合数据集在数据模型中的使用
聚合数据集只使用模型主表字段时,可以把它与主表的数据模型进行关联,反向对主表进行明细的筛选查看。主表的聚合数据集拖入主表的数据模型后,可能会出现循环引用等情况,此时会向用户发出提示信息。 下面列出一些在主表模型中拖入主表的聚合数据集,会发生报错的场景。
在主表的数据模型中:
- 主表的聚合数据集使用了除主表之外其它的数据集字段,此时该聚合数据集不允许添加到主表模型中。
- 主表的聚合数据集拖入模型后生效机制设置为始终关联,此时不允许添加该聚合数据集。
- 模型中若上游数据集中有主表聚合数据集,则下游数据集生效机制不允许设置为始终关联,如果设置为始终关联则不允许添加。
对模型中的数据集追加数据时:
- 在模型中主表的聚合数据集都不允许进行上下合并操作,对数据集追加数据。
- 模型中的其他数据集进行上下合并操作时也不能追加主表聚合数据集的字段。
当主表聚合数据集拖入模型后:
- 编辑主表聚合数据集时如果添加了模型中非主表的字段则报错。
- 使用模型中的从表替换主表聚合数据集时报错。
数据模型在图表中的压缩维度
假设数据模型的模型表为 A,从表 B 与 A关联, B 关联基数为"1:多";从表 C 与 A关联,C 关联基数为“多:多”。本文在这个模型上做图,描述压缩维度
功能的作用。
- 图表中维度设置为来自于 A 的字段, a_f1。
- 图表中度量设置为来自于 B 的字段计算, sum({b_f2})。
- 图表中度量设置为来自于 C 的字段计算, sum({c_f3})。
- 没有设置
压缩维度
功能的情况下,由于从表 B 创建比从表 C 早,那么维度的字段值来自于计算 sum({b_f2}) 时引入的维度字段值。 - 设置 sum({b_f2}) 度量为
压缩维度
,对于图表数据来讲和没有设置压缩维度
效果相同,但是对于使用者来讲,可以主动确定维度的字段值,因为使用者很难分清楚从表的创建时间。 - 设置 sum({c_f3}) 度量为
压缩维度
,那么维度的字段值来自于计算 sum({c_f3}) 时引入的维度字段值,图表的结果数据可能就会发生变化,肯定会发生变化的例子:
- A 和 C 的关联类型是 inner join,A 的维度值变少了,它会导致图表的维度值变少。
- 图表中有对数据集 C 的过滤条件,导致 A 和 C 的关联值被过滤了,A 的维度值变少了,它也会导致图表的维度值变少。
- 图表中有对数据集 B 的过滤条件,但是没有对数据集 C 的过滤条件,那么 sum({c_f3}) 的计算就会引入更多的维度值,从而使图表的维度值变多。
数据模型性能优化指南
- 关联条件尽量使用
等于(=)
操作符。 - 关联条件中使用的字段在数据库表中有配置索引,并且在关联条件中避免类型转换造成的索引失效。
- 关联模型中慎用会带入
多对多
关联基数的关系,它到导致模型计算的膨胀。 - 关联模型通常是直接用于查询的,可以做一些明细数据的预聚合并实体化,再用结果数据构建数据模型。
- 如果只针对数据集的一部分数据做分析,建议在模型计算之前引入数据集的过滤条件,比如把过滤条件放在数据集的过滤器或者行权限中。
数据模型与多表联合数据集的区别
- 多表联合数据集涉及到的数据集都会参与计算,关联模型涉及到的数据集可以是按需参与计算。
- 多表联合数据集的结果可以物化成一张大宽表。
- 数据模型提供了更加灵活的建模方式,比如维度去重功能、环形模型、动态的数据集生效机制选择等。
- 做图的时候,多表联合数据集的使用方式是一张宽表,屏蔽了它的上游数据集;数据模型的使用方式是数据集列表。