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


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支持以下数据类型 。

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

文章插图
深入理解超级表
同时采集同表:一张超级表里,包含的采集物理量必须是同时采集的,也就是说时间戳都是相同的 。
对一个类型的设备,可能存在多组物理量,每组物理量并不是同时采集的,则需要为每组物理量单独建一个超级表 。因此一个类型的设备,可能需要建立多个超级表 。
系统有N个不同类型的设备,就需要建立至少N个超级表 。
一个系统可以有多个DB库,一个DB库里可以有一到多个超级表 。
创建表/子表
【TDengine的数据建模?库、表、超级表是什么?怎么用?】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既支持多列模型,也支持单列模型 。
?多列模型?:只要物理量是同一数据采集点同时采集的,这些量就可以作为不同列放在一张超级表里 。
?单列模型?:每个物理量都单独建表 。比如电流、电压两个量,就建两张超级表 。
我们建议:尽可能采用多列模型,因为插入效率以及存储效率更高;对于有些场景,一个采集点的物理量的种类经常变化,这时可采用单列模型 。
?新能源汽车示例
场景及建模分析