TDengine的数据建模?库、表、超级表是什么?怎么用?

?欢迎来到物联网的数据世界
在典型的物联网场景中 , 一般有多种不同类型的采集设备,采集多种不同的物理量,同一种采集设备类型,往往有多个设备分布在不同的地点,系统需对各种采集的数据汇总,进行计算和分析对于同一类设备,其采集的数据都是很规则的 。
本文我们以智能电表(采集量为电流、电压)为例 , 探讨如何在TDengine中建库、建超级表、建表 。
假设每个智能电表采集电流、电压两个量,其采集的数据如下图所示 。

TDengine的数据建模?库、表、超级表是什么?怎么用?

文章插图
每一条记录都有设备ID,时间戳,采集的物理量(如上图中的电流、电压),还有与每个设备相关的静态标签(如上图中的位置Location和分组groupId) 。每个设备是受外界的触发,或按照设定的周期采集数据 。采集的数据点是时序的,是一个数据流 。
那么TDengine如何抽象这些物联网数据呢?
这里,需要提到TDengine的关键创新点——?一个采集点一张表? 。同一类型的采集点用一个超级表来描述,也就是一个表结构Schema和静态标签Schema。就上图来说,电表ID作为子表名(d1001, d1002, d1003, d1004等),动态采集的物理量作为各字段,静态属性(Location和groupId)作为子表标签 。利用超级表作为模板,生成子表 – 对应各采集点 , 有了超级表,极大地方便了同类采集点的数据检索、查询、聚合 。
这种设计有几大优点:
  • 能保证一个采集点的数据在存储介质上是以块为单位连续存储的 。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度 。
  • 由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升 。
  • 对于一个数据采集点而言 , 其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度 。
如果采用传统的方式,将多个设备的数据写入一张表,由于网络延时不可控,不同设备的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个设备的数据是难以保证连续存储在一起的 。采用一个数据采集点一张表的方式 , 能最大程度的保证单个数据采集点的插入和查询的性能是最优的 。
?数据建模的基本方法
TDengine采用关系型数据模型,需要建库、建表 。因此对于一个具体的应用场景,需要考虑库的设计,超级表和普通表的设计 。
CREATE DATABASE dbnameUSE dbnameCREATE TABLE stbname (ts timestamp, other fields…) tags ( tag fields)CREATE TABLE tbname using stbname tags(具体标签值)INSERT INTO tbname VALUES(now, values…)实例
INSERT INTO ${tableName} USING xm_values (groupId) TAGS (2)VALUES<foreach collection="paramList" item="param"separator=",">(#{param.time_new},#{param.stid},null,#{param.value},#{param.sblx},#{param.time},#{param.homeRoom},#{param.friendlyName})</foreach>创建库
不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低 , 数据保留时间的长短 , 副本的数目,数据块的大小等 。为让各种场景下TDengine都能最大效率的工作,建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略 。
创建一个库时,除SQL标准的选项外,应用还可以指定保留时长、副本数、内存块个数、时间精度、文件块里最大最小记录条数、是否压缩、一个数据文件覆盖的天数等多种参数 。比如建议为数据特征相同的表创建一个库 , 每个库可以配置不同的存储策略 。
CREATE DATABASE power KEEP 365;上述将创建一个名为power的库,这个库的数据将保留365天 。更多参数及语法见:
https://www.taosdata.com/cn/documentation20/taos-sql/创建库之后,需要使用SQL命令USE将当前库切换过来,例如:
USE power;将当前操作库换为power 。还可使用“库名.表名”来指定操作的库、表的名字 。
引入超级表
一个数据采集点一张表,意味着1000万智能电表对应1000万张表,一个物联网系统,往往存在海量同类型的数据采集点 。如何对这么多张表进行操作就是一个巨大的挑战 。为方便对同类型多表的操作,TDengine引入超级表 。
创建超级表时 , 需提供:表名、表结构Schema、标签Schema 。
CREATE TABLE meters (ts timestamp, current float, voltage int) TAGS (location binary(64), groupdId int);

推荐阅读