...
锚 |
---|
| Syjh-1737442340427 |
---|
| Syjh-1737442340427 |
---|
|
一种产品类别会有多个产品;
锚 |
---|
| k0KW-1738993270438 |
---|
| k0KW-1738993270438 |
---|
|
一种产品可来源于多条订单明细;
锚 |
---|
| uPnM-1737442428651 |
---|
| uPnM-1737442428651 |
---|
|
一个订单可对应多条订单明细;
锚 |
---|
| J4HO-1738992921687 |
---|
| J4HO-1738992921687 |
---|
|
一位顾客能产生多条订单记录;
锚 |
---|
| lba8-1739726837102 |
---|
| lba8-1739726837102 |
---|
|
锚 |
---|
| Wt6p-1739383759424 |
---|
| Wt6p-1739383759424 |
---|
|
因此可以得到如下图的关系连线:
锚 |
---|
| ELlt-1739726832205 |
---|
| ELlt-1739726832205 |
---|
|
每条关系都可以用一条线表示,并指示了俩端(1表示1端,*表示多端)
锚 |
---|
| u9z8-1739381365054 |
---|
| u9z8-1739381365054 |
---|
|
Image Modified 锚 |
---|
| ySAu-1738993993022 |
---|
| ySAu-1738993993022 |
---|
|
锚 |
---|
| NM5L-1737442462032 |
---|
| NM5L-1737442462032 |
---|
|
这样,基于上述业务逻辑的梳理,我们就已经得知了订单模型中各表之间的联系,接下来,就可以在数据模型中深究关系的配置及原理了。
锚 |
---|
| 1sV8-1737009669767 |
---|
| 1sV8-1737009669767 |
---|
|
关系组成四大要素
锚 |
---|
| eekc-1737009672866 |
---|
| eekc-1737009672866 |
---|
|
那要在数据模型里构成关系,咱就可以了解下构成表关系的这四大要素:表(维表、事实表)、连接字段(列)、基数、筛选方向。
锚 |
---|
| jd7w-1738995567679 |
---|
| jd7w-1738995567679 |
---|
|

锚 |
---|
| toC7-1739001859651 |
---|
| toC7-1739001859651 |
---|
|
一:表(维度表、事实表) 锚 |
---|
| Usqv-1737009798776 |
---|
| Usqv-1737009798776 |
---|
|
这里的表可以叫主键表、外键表,在数据模型中我们通常把他叫做维度表、事实表。我们经常能看到,数据模型里的表有的是蓝色有的是绿色,这就是咱用来初步区分维表和事实表的颜色标识。其中,
锚 |
---|
| wtYI-1739002305629 |
---|
| wtYI-1739002305629 |
---|
|
蓝色是维度表,代表没有度量的表。如:产品表、客户表、员工表等包含一些属性特性,比如产品具有颜色、类别、成本等;
锚 |
---|
| Rn3f-1739002320968 |
---|
| Rn3f-1739002320968 |
---|
|
绿色是事实表,代表有度量的表。如销售记录表等涉及某些维度事件记录的可度量数据,比如销售额、销售量等。
锚 |
---|
| ojN1-1739002815095 |
---|
| ojN1-1739002815095 |
---|
|
表在数据模型中也会叫做查询,目前有9种类型可选,包含数据源表、SQL查询等。在模型视图中,"一"方代表维度表,"多"方代表事实表。
需要注意:由于是动态建模,在查询时根据勾选的字段,维表也可能会变成事实表。 锚 |
---|
| e2vu-1739002257970 |
---|
| e2vu-1739002257970 |
---|
|

锚 |
---|
| nUlj-1739001860519 |
---|
| nUlj-1739001860519 |
---|
|
二:连接字段 锚 |
---|
| MQ4N-1739001860529 |
---|
| MQ4N-1739001860529 |
---|
|
对关系的连接线段"双击"或者"右键编辑",可以修改连接字段、基数和筛选方向。
锚 |
---|
| i91r-1739009597782 |
---|
| i91r-1739009597782 |
---|
|
一般关系中的连接字段是以表的主键或者外键来建立联系的,目前Smartbi会自动识别主键和外键,确定两个表之间关联字段,通过获取字段名,然后逐个匹配,查找别名相同的列且数据类型要一致,才会自动关联。
锚 |
---|
| NgFr-1739003483331 |
---|
| NgFr-1739003483331 |
---|
|

锚 |
---|
| EQzd-1739001860532 |
---|
| EQzd-1739001860532 |
---|
|
此外,在设置连接字段时,如果发现原始表中缺少必要的关联键或者需要基于现有字段计算出新的关联键,比如想要关系字段需要使用contact、replace等函数进行拼接、替换等,可以通过自定义计算列加工出来。
锚 |
---|
| doDR-1739151982364 |
---|
| doDR-1739151982364 |
---|
|

锚 |
---|
| Up6H-1739001861072 |
---|
| Up6H-1739001861072 |
---|
|
三:基数 锚 |
---|
| xwkt-1739001861081 |
---|
| xwkt-1739001861081 |
---|
|
基数也就是1和*,能用来反映真实业务数据之间联系,数据模型中的基数类型有:一对一、一对多、多对一(不支持多对多)。
锚 |
---|
| YRpW-1739155835359 |
---|
| YRpW-1739155835359 |
---|
|
基数的选择是决定模型关系设置是否正确的关键之一,很多小伙伴在前期错误的设置了基数关系,那后来数据动态变化了不满足基数选择就经常会出现查询数据错误的情况了。这就要求咱们在选择基数关系时,需要理解真实业务,判断真实业务之间是一对一、一对多还是多对多的联系。
锚 |
---|
| dNww-1739377868691 |
---|
| dNww-1739377868691 |
---|
|
那其实Smartbi产品上可通过"自动检测表关系"或手动点击"检测关系"的功能来辅助我们确定两表之间的关系。它检测的原理是:
锚 |
---|
| KmbL-1739378297689 |
---|
| KmbL-1739378297689 |
---|
|
逐个判断查询相同别名的字段列,是1还是多;当count()的数量和distinct count()的数据不一致,说明该列是"多",否则为"1"。
锚 |
---|
| yg9e-1739378327666 |
---|
| yg9e-1739378327666 |
---|
|
例如:orders 与orderDetail 表,关联字段是OrderID,当orders 的count(
)与distinct count(OrderID),是一致的,则认为是"一"的一方;当orderDetail的count()与distinct count(OrderID)不是一致时,则认为是"多"的一方。
锚 |
---|
| umMe-1739378328395 |
---|
| umMe-1739378328395 |
---|
|
注意:这个检测方法会做一次count,所以数据库执行count慢时,会出现检测性能问题;自动构建表关系就是依赖基数检测结果,如果数据量很大时,建议关闭自动检测基数。
锚 |
---|
| bgtL-1739378251596 |
---|
| bgtL-1739378251596 |
---|
|

锚 |
---|
| QwYa-1739001861084 |
---|
| QwYa-1739001861084 |
---|
|
虽然产品目前并不直接支持多对多关系,但遇到多对多关系场景时,我们可以采用星型架构设计原则,而不是直接关联事实类型表。 一般可以通过添加维度表来实现, 然后,维度类型表通过使用一对多关系与事实类型表关联。 通过这种设计方法,可使用任何维度类型列进行筛选或分组,并汇总任何相关联的事实类型表。(具体示例见下篇-"示例3、多对多")
锚 |
---|
| HdLE-1739378137555 |
---|
| HdLE-1739378137555 |
---|
|
四:筛选方向 锚 |
---|
| nLZr-1739002612097 |
---|
| nLZr-1739002612097 |
---|
|
筛选方向定义的是维度之间过滤方向,在模型视图中用箭头表示,A->B代表A中的维度可以筛选B中的数据,而B中的维度不可以筛选A中的数据。
锚 |
---|
| ZzQB-1739378498949 |
---|
| ZzQB-1739378498949 |
---|
|
筛选方向包含了单向和双向,在这里筛选方向结合基数一起更好做理解:
...