概念
实体与关系是ThingsBoard中的关键概念之一。官网介绍
实体包括:租户/客户/用户/设备/资产/实体视图/警报/仪表板/规则节点/规则链。
每个实体都支持:属性/时间序列数据/关系
数据表
ThingsBoard的关系储存在postgres thingsboard数据库中relation表中,包括下列字段
其中字段from_type
和to_type
可以是实体类型的任意一种。参考源码EntityType,也符合官网文档描述的每种实体都支持关系
public enum EntityType {
TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW,
WIDGETS_BUNDLE, WIDGET_TYPE, TENANT_PROFILE, DEVICE_PROFILE, API_USAGE_STATE;
}
字段from_id
和to_id
则是对应的实体id
字段relation_type_group
是实体类型的分组,可填值有五个。参考源码RelationTypeGroup。
public enum RelationTypeGroup {
COMMON,ALARM,DASHBOARD,RULE_CHAIN,RULE_NODE
}
relation_type
的值就太多了
如果relation_type_group=COMMON 则relation_type可以是Contains或Manages
如果relation_type_group=RULE_NODE 则relation_type可以是任意规则节点定义的relationTypes。
比如TbMsgTypeSwitchNode的relationTypes可选值如下:
字段additional_info
储存JSON格式的额外信息。这个字段很多表都有,如:rule_node表additional_info储存仪表板的横纵坐标。
案例
资产与设备的关系
法外狂徒张三做ThingsBoard二次开发,想查询某个资产下面的所有一级设备,却找不到对应的关系表,不知从何下手。于是便向一生之敌李四请教,李四立刻开门见三:
select *
from relation
where from_type = 'ASSET'
and from_id = '66922bf0-a977-11eb-82ca-8fb54f86456f'
and to_type = 'DEVICE'
and relation_type_group = 'COMMON';
规则链
规则链是如何在数据库储存的?每个规则节点是如何连起来的?(规则节点之间的关系)
以Root Rule Chain为例,查看rule_chain表:储存着第一个规则节点的id
所有的规则节点信息储存在rule_node表,rule_node表中没有任何描述规则节点之间的父子级关系的字段。
那么关系存在哪里呢?消息处理在这个节点处理完,如何知道该传给下一个节点是谁呢?还是在relation表中。
继续以Root Rule Chain为例,储存着规则链的第一个规则节点的id=becdeac0-8168-11eb-8672-fd998e746260
写个SQL找出此节点后面的所有节点 from_id填入的就是规则链的第一个规则节点的id(这不是源码的sql,没有查证,是自己写的)
WITH RECURSIVE views AS (
SELECT from_type, from_id, to_type, to_id
FROM relation
WHERE from_id = 'becdeac0-8168-11eb-8672-fd998e746260'
UNION
SELECT r.from_type, r.from_id, r.to_type, r.to_id
FROM relation r
INNER JOIN views v ON v.to_id = r.from_id
) select * FROM views
最后
也不是所有的关系都在relation表,比如给客户分配设备,能在relation表找到关系吗?
device表本身就有tenant_id和customer_id字段来标识设备所属的租户和客户。
下一篇文章聊聊如何通过relation表结合SQL与存储过程,实现统计资产相关设备的总数,在线数量,离线数量
github ThingsBoard的问题反馈中提到类似问题