小 T 导读:在应用 TDengine 的时候,通过官网的技术文档能够学习到建库(database)、建表(table)的各种 SQL 语句,然而一旦要跟本人的具体业务场景联合,经验不足的敌人可能会不晓得到底如何下手,本文将分享一些常见的建模形式,心愿帮忙大家更好地落地 TDengine。
不同于 OpenTSDB、Prometheus 等时序数据库(Time-Series Database),TDengine 容许一个表有多个列(即每条记录中,多个采集量共用一个工夫戳的存储形式),这样在建表时能够有更大的灵活性。
智能电表是个典型的能够依照设施建表,多列存储时序数据的例子。但在理论应用过程中,状况可能会更简单,肯定要联合自身数据的状况来灵便设计表构造。
依照设施建表,在官网文档中曾经有具体的例子和介绍,本文除了介绍一个设施一张表的建模形式外,还会对另外几种建模形式做一个补充。
1、依照设施建表的规范情景
上文中的智能电表例子就是一个设施一张表的规范情景。这种规范情景有以下特点:
(1) 雷同类型的设施,采集指标完全相同。(比方上文例子中的智能电表,只采集电流、电压、相位三个指标)
(2) 就同一个设施而言,各采集指标同时采集,采集工夫戳雷同。
(3) 就同一个设施而言,各采集指标每次采集的数据最好是在同一个音讯中上报到 TDengine,而非别离上报。
这种状况的解决最简略:
- 采纳多列模式,即为每个类型的设施创立一张多列超级表。
- 为该类型的每个设施创立一张子表。
- 子表从第二列起,每一列均为一个采集指标。
图一:TDengine database 表设计
以智能电表为例:
图二:一个采集点一张表
图三:超级表应用实例
2、依照设施建表,但同类型设施的采集指标不完全相同
理论生产中,同类型的设施有时候采集指标也不完全相同,这种状况下有以下特点:
(1) 雷同类型的设施,采集指标大体雷同,但每个设施可能有大量个性化的指标。(前提:所有个性化指标总数加上共有指标总数不超过 1024 个,2.1.7.0 版本后总数为不超过 4096 个)
(2) 就同一个设施而言,各采集指标同时采集,采集工夫戳雷同。
(3) 就同一个设施而言,各采集指标每次采集的数据在同一个音讯中上报到 TDengine,而非别离上报。
这种状况相似于 1,但区别是每个设施可能有个性化的采集指标。针对这种情景的解决思路常称为“大宽表”:
- 创立一个多列超级表,蕴含所有不同的采集指标列,为所有采集指标的选集。
- 为每个设施创立一张子表。
- 子表从第二列起,每一列均为一个采集指标。
- 数据写入时,对于该设施不具备的采集指标填入 null 值。
图示和图三靠近,不同处在于建设超级表时,采集指标须要依照最多的设施去解决。
3、依照采集指标建表 -1
更简单的场景中,设施的固定表构造很难形象进去,或者表构造常常扭转,无奈固定,此时须要有更灵便的解决思路。以下任一个特点满足时,需思考按指标建表的思路:
(1) 雷同类型的设施,采集指标无奈固定,或者每个设施有大量个性化的指标。(前提:所有个性化指标总数加上共有指标总数超过 1024,2.1.7.0 版本后为指标总数超过 4096 个)
(2) 就同一个设施而言,各采集指标有各自的采集工夫戳。(即同一个设施的不同采集指标的采集工夫、采集周期等无奈保障雷同)
(3) 就同一个设施而言,各采集指标每次采集的数据分多个音讯上报到 TDengine,且时间延迟无奈确定。
这种情景要求更高的灵活性。个别解决思路如下:
- 创立单列的超级表,即工夫戳 + 采集值,而在标签项中减少采集指标 ID 这一标签。
- 每个设施的每个采集指标独自创立一张表,在标签项中减少具体的采集指标 ID。
- 不同数据类型的采集指标要划归不同超级表,比方数值型、布尔型和字符串型的数据应该别离纳入三类对应的超级表。
图四:单列模型建模示例
示例如下:
图五:单列模型建模实例
4、依照采集指标建表 -2
此场景可能呈现在工业物联网 PLC 数据采集中。
(1) 雷同类型的设施,采集指标无奈固定。
(2) 就同一设施而言,各采集指标有各自的采集频率,不过采集频率是确定的,比方 PLC1~PLC10 的采集频率是 10ms,PLC11~PLC20 的采集频率是 20ms。
(3) 就同一设施而言,后续可能会动静增加 PLC 通道。冀望能够在不批改代码的状况下动静减少超级表的列。
(4) 心愿通过一个超级表来对立治理。
建模思路:
- 创立多列的超级表,采集字段不同的数据类型各设置建设一个。即工夫戳 + 采集值 int+ 采集值 double+ 采集值 nchar……,而在标签项中减少采集指标 ID 这一标签。
- 每个设施的采集指标独自创立一张表,在标签项中减少具体的采集指标 ID。
- 其中工夫戳必填的列,残余列则要依据测点类型填写,比方测点上报的是整形数据,就只须要设置 time、采集值 int 这两列,其余列为 null。
示例如下:
图六:依照采集指标建模实例
以上为几种常见建模形式,笼罩了大部分的理论场景,当然理论业务中的状况是多种多样的,如果以上建模思路不能满足,也欢送和退出 TDengine 的用户社区,咱们一起交换。
想理解更多 TDengine Database 的具体细节,欢送大家在 GitHub 上查看相干源代码。