概念

实体与关系是ThingsBoard中的关键概念之一。官网介绍
实体包括:租户/客户/用户/设备/资产/实体视图/警报/仪表板/规则节点/规则链。
每个实体都支持:属性/时间序列数据/关系

数据表

ThingsBoard的关系储存在postgres thingsboard数据库中relation表中,包括下列字段
image.png
其中字段from_typeto_type可以是实体类型的任意一种。参考源码EntityType,也符合官网文档描述的每种实体都支持关系

  1. public enum EntityType {
  2. TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW,
  3. WIDGETS_BUNDLE, WIDGET_TYPE, TENANT_PROFILE, DEVICE_PROFILE, API_USAGE_STATE;
  4. }

字段from_idto_id则是对应的实体id
字段relation_type_group是实体类型的分组,可填值有五个。参考源码RelationTypeGroup。

  1. public enum RelationTypeGroup {
  2. COMMON,ALARM,DASHBOARD,RULE_CHAIN,RULE_NODE
  3. }

relation_type的值就太多了
如果relation_type_group=COMMON 则relation_type可以是Contains或Manages
image.png
如果relation_type_group=RULE_NODE 则relation_type可以是任意规则节点定义的relationTypes。
比如TbMsgTypeSwitchNode的relationTypes可选值如下:
image.png
字段additional_info储存JSON格式的额外信息。这个字段很多表都有,如:rule_node表additional_info储存仪表板的横纵坐标。

案例

资产与设备的关系

法外狂徒张三做ThingsBoard二次开发,想查询某个资产下面的所有一级设备,却找不到对应的关系表,不知从何下手。于是便向一生之敌李四请教,李四立刻开门见三:

  1. select *
  2. from relation
  3. where from_type = 'ASSET'
  4. and from_id = '66922bf0-a977-11eb-82ca-8fb54f86456f'
  5. and to_type = 'DEVICE'
  6. and relation_type_group = 'COMMON';

当然还需要考虑relation_type

规则链

规则链是如何在数据库储存的?每个规则节点是如何连起来的?(规则节点之间的关系)
以Root Rule Chain为例,查看rule_chain表:储存着第一个规则节点的id
image.png
所有的规则节点信息储存在rule_node表,rule_node表中没有任何描述规则节点之间的父子级关系的字段。
rule_node.png
那么关系存在哪里呢?消息处理在这个节点处理完,如何知道该传给下一个节点是谁呢?还是在relation表中。
继续以Root Rule Chain为例,储存着规则链的第一个规则节点的id=becdeac0-8168-11eb-8672-fd998e746260
image.png
写个SQL找出此节点后面的所有节点 from_id填入的就是规则链的第一个规则节点的id(这不是源码的sql,没有查证,是自己写的)

  1. WITH RECURSIVE views AS (
  2. SELECT from_type, from_id, to_type, to_id
  3. FROM relation
  4. WHERE from_id = 'becdeac0-8168-11eb-8672-fd998e746260'
  5. UNION
  6. SELECT r.from_type, r.from_id, r.to_type, r.to_id
  7. FROM relation r
  8. INNER JOIN views v ON v.to_id = r.from_id
  9. ) select * FROM views

结果
image.png
对照一下规则链
image.png
image.png

最后

也不是所有的关系都在relation表,比如给客户分配设备,能在relation表找到关系吗?
device表本身就有tenant_id和customer_id字段来标识设备所属的租户和客户。
device.png


下一篇文章聊聊如何通过relation表结合SQL与存储过程,实现统计资产相关设备的总数,在线数量,离线数量
github ThingsBoard的问题反馈中提到类似问题
image.png