乐趣区

关于tdengine:库表超级表是什么怎么用60后大叔抽丝剥茧讲清TDengine的数据建模

视频教程第二弹,疾速理清 TDengine 中的抽象概念,并学会布局生产场景中的数据模型。

点击链接,获取视频教程。

欢送来到物联网的数据世界

在典型的物联网场景中,个别有多种不同类型的采集设施,采集多种不同的物理量,同一种采集设施类型,往往有多个设施散布在不同的地点,零碎需对各种采集的数据汇总,进行计算和剖析对于同一类设施,其采集的数据都是很规定的。

本文咱们以智能电表 (采集量为电流、电压) 为例,探讨如何在 TDengine 中建库、建超级表、建表。

假如每个智能电表采集电流、电压两个量,其采集的数据如下图所示。

每一条记录都有设施 ID,工夫戳,采集的物理量(如上图中的电流、电压),还有与每个设施相干的动态标签(如上图中的地位 Location 和分组 groupId)。每个设施是受外界的触发,或依照设定的周期采集数据。采集的数据点是时序的,是一个数据流。

那么 TDengine 如何形象这些物联网数据呢?

这里,须要提到 TDengine 的要害翻新点——一个采集点一张表。同一类型的采集点用一个超级表来形容,也就是一个表构造 Schema 和动态标签 Schema。就上图来说,电表 ID 作为子表名(d1001, d1002, d1003, d1004 等),动静采集的物理量作为各字段,动态属性(Location 和 groupId)作为子表标签。利用超级表作为模板,生成子表 – 对应各采集点,有了超级表,极大中央便了同类采集点的数据检索、查问、聚合。

这种设计有几大长处:

  • 能保障一个采集点的数据在存储介质上是以块为单位间断存储的。如果读取一个时间段的数据,它能大幅缩小随机读取操作,成数量级的晋升读取和查问速度。
  • 因为不同采集设施产生数据的过程齐全独立,每个设施的数据源是惟一的,一张表也就只有一个写入者,这样就可采纳无锁形式来写,写入速度就能大幅晋升。
  • 对于一个数据采集点而言,其产生的数据是时序的,因而写的操作可用追加的形式实现,进一步大幅提高数据写入速度。

如果采纳传统的形式,将多个设施的数据写入一张表,因为网络延时不可控,不同设施的数据达到服务器的时序是无奈保障的,写入操作是要有锁爱护的,而且一个设施的数据是难以保障间断存储在一起的。采纳一个数据采集点一张表的形式,能最大水平的保障单个数据采集点的插入和查问的性能是最优的。

数据建模的根本办法

TDengine 采纳关系型数据模型,须要建库、建表。因而对于一个具体的利用场景,须要思考库的设计,超级表和一般表的设计。

CREATE DATABASE dbname
USE dbname
CREATE TABLE stbname (ts timestamp, other fields…) tags (tag fields)
CREATE TABLE tbname using stbname tags(具体标签值)
INSERT INTO tbname VALUES(now, values…)

创立库

不同类型的数据采集点往往具备不同的数据特色,包含数据采集频率的高下,数据保留工夫的长短,正本的数目,数据块的大小等。为让各种场景下 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);

超级表的列分两局部:动静局部,动态局部。

动静局部是采集的数据,第一列为工夫戳(ts),其余列为采集的物理量(current, voltage)。

动态局部指采集点的动态属性,个别作为标签。如采集点的地理位置、设施型号、设备组、管理员 ID 等。

标签能够预先减少、删除、批改。

TDengine 反对以下数据类型。

深刻了解超级表

同时采集同表:一张超级表里,蕴含的采集物理量必须是同时采集的,也就是说工夫戳都是雷同的。

对一个类型的设施,可能存在多组物理量,每组物理量并不是同时采集的,则须要为每组物理量独自建一个超级表。因而一个类型的设施,可能须要建设多个超级表。

零碎有 N 个不同类型的设施,就须要建设至多 N 个超级表。

一个零碎能够有多个 DB 库,一个 DB 库里能够有一到多个超级表。

创立表 / 子表

TDengine 对每个数据采集点须要独立建表;因为源于超级表 (meters) 创立而成,也称子表(d1001);创立时,须要应用超级表做模板,同时指定标签的具体值;一个超级表,可蕴含若干子表,子表数量没有限度。

CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);

d1001 是子表名,meters 是超级表名,紧跟 Location 的标签值”Beijing.Chaoyang”,groupId 的标签值 2。在创立表 / 子表时,需指定标签值,预先也可批改;倡议将数据采集点的全局惟一 ID 作为子表名(如设施序列号)。

子表主动建表

在某些非凡场景中,用户在写数据时,并不确定某个子表是否存在。此时,可应用主动建表语法来创立不存在的表,若该表已存在则不会建设新表。

INSERT INTO d1001 USING meters TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219);

上述 SQL 语句将记录(now, 10.2, 219) 插入进表 d1001,如果表 d1001 还未创立,则应用超级表 meters 做模板主动创立,同时打上标签值“Beijing.Chaoyang”, 2。

多列模型 vs 单列模型

TDengine 既反对多列模型,也反对单列模型。

  • 多列模型:只有物理量是同一数据采集点同时采集的,这些量就能够作为不同列放在一张超级表里。
  • 单列模型:每个物理量都独自建表。比方电流、电压两个量,就建两张超级表。

咱们倡议:尽可能采纳多列模型,因为插入效率以及存储效率更高;对于有些场景,一个采集点的物理量的品种常常变动,这时可采纳单列模型。

新能源汽车示例

场景及建模剖析

  • 某车企拟对其生产、销售的新能源汽车进行追踪剖析;
  • 每辆车配置了近程采集终端,采集车辆状态信息:地位(经纬度)、车速、电池温度、电池电流、环境温度、轮胎胎压;
  • 后盾统计分析须要按:车型、销售区域、销售员、电池包容量、电机功率进行分类聚合;
  • 6 个采集量中前 4 个为同时采集,将其放入一张超级表 – vehicle_main, 其余 2 个测点,温度与胎压采集的频率齐全不一样,别离创立 2 个超级表 – vehicle_temp, vehicle_tire;
  • 每辆车有惟一编码 VIN,采纳该编码与超级表的表名前缀作为惟一表名。

SQL 语句示例

CREATE DATABASE nev KEEP 3650;
USE nev;
CREATE TABLE vehicle_main (ts timestamp, longitude double, latitude double, vspeed int, btemp int, bcurrent int) TAGS (vin binary(30), model binary(20), szone binary(30), sales int, bcapacity float, mpower float);
CREATE TABLE vmTS8392EGV062192009 USING vehicle_main TAGS ("TS8392EGV062192009", "GTS7180", "Beijing.haidian", "10060089", 86.0, 125.5);
CREATE TABLE vehicle_temp (ts timestamp, vtemp int) TAGS (vin binary(30));
CREATE TABLE vtpTS8392EGV062192009 USING vehicle_vtemp TAGS ("TS8392EGV062192009");
CREATE TABLE vehicle_tire (ts timestamp, vpressure int) TAGS (vin binary(30));
CREATE TABLE vtrTS8392EGV062192009 USING vehicle_vtire TAGS ("TS8392EGV062192009");

// 查问指定车辆最近 10 天的运行轨迹
SELECT ts, longtitude, latitude FROM vtrTS8392EGV062192009 where ts >now -10d

// 按车型查问均匀车速、均匀动力电池温度、均匀放电电流
SELECT AVG(vspeed), AVG(btemp), AVG(bcurrent) FROM vehicle_main GROUP BY model

置信到这里,你曾经齐全理清了 TDengine 中库、表、超级表的概念,能够上手操作了!

关注公众号 TDengine,后盾回复“1203”,获取本教程对应 PPT。

退出移动版