TDengine 基础概念和知识点

时间:2025-02-13 16:22:40

一、前文

TDengine 入门教程——导读

二、库(Database)

  • TDengine 容许一个运行实例有多个库。
  • 每个库可以配置不同的存储策略,包括内存池,缓存子表,数据保留策略等
  • 一个库可以有多个表。

三、超级表(STable)

  • 超级表不是传统意义上的数据表,超级表只是一个表的模板,不能存储任何数据。
  • 超级表的数据存储在它的子表。
  • 超级表可以有多个子表。

PS:我个人是觉得,超级表这个取名是个败笔,容易误导人。取名“母表”更好。

四、普通表(Table)

  • 普通表就是常规意义上的表,既有表的定义,又能存储数据。
  • 普通表跟超级表对比没有意义,不是一个层级的。
  • 普通表适合跟子表对比。

五、子表(Subtable)

  • 子表本质就是普通表。
  • 子表的表定义从超级表继承,普通表的表定义是自己有的。
  • 子表跟普通表的不同在于静态标签。子表有静态标签,普通表没有静态标签。
  • 子表一定属于一张超级表,但普通表不属于任何超级表。
  • 普通表无法转为子表,子表也无法转为普通表。

从如下的sql语句可以得出

  • create table不带tags建表,成普通表
  • create tabletags建表,成超级表
taos> use test;
Database changed.

taos> create table test1(ts timestamp, temperature float);
Query OK, 0 of 0 rows affected (0.000728s)

taos> create table test2(ts timestamp, temperature float) tags(groupId int);
Query OK, 0 of 0 rows affected (0.001273s)

taos> show tables;
           table_name           |
=================================
 test1                          |
Query OK, 1 rows in database (0.003077s)

taos> show stables;
          stable_name           |
=================================
 test2                          |
Query OK, 1 rows in database (0.001557s)

六、标签(TAG)

标签,英文:TAG

TDengine的标签和InfluxDB的标签,差异较大:

  • TDengine的标签指的是静态属性。
  • InfluxDB的标签指的是索引。

TDengine标签的增加和删除只能作用于超级表。

  • 超级表添加一个标签以后,该超级表下的所有子表会自动增加该标签。
    • 对于数值型的标签,新增加的标签的默认值是 0。
  • 超级表删除一个标签以后,该超级表下的所有子表会自动删除该标签。
    • 说明:第一列标签不能删除,至少需要为超级表保留一个标签。

TDengine标签数据的修改只能作用于子表。

七、数据点(Data Point)

标签是静态的。

数据点是动态的,随着时间变化而变化。

这就是时序数据库最大的特点。所有的数据点都带有时间戳。

如果脱离了时间,数据点就没有了意义。

八、数据库设计

因地制宜,我们基于TDengine和InfluxDB两类不同特性的时序数据库,以电表数据为例,进行数据库设计。

电表数据主要有

数据点 标识 类型 特性
电表编号 id vchar 静态
电表位置 location vchar 静态
电表类型 ttype int 静态
分组编号 groupId int 静态
正向有功总电量 electricity float 动态

8.1 TDengine数据库设计

设计一张超级表,一个电表一张子表。

电表编号作为子表的表名。

create table (ts timestamp, electricity float) tags(location nchar(64), groupId int, ttype int)

子表d1存储编号为d1电表的数据:

电表位置 电表类型 分组编号 时间 正向有功总电量
福建省厦门市 1 1 2022/09/18 00:15:00 0
福建省厦门市 1 1 2022/09/18 02:15:00 0.11

子表d2存储编号为d2电表的数据:

电表位置 电表类型 分组编号 时间 正向有功总电量
福建省福州市 1 1 2022/09/18 00:15:00 10
福建省福州市 1 1 2022/09/18 02:15:00 20.2

8.2 InfluxDB数据库设计

InfluxDB 为无模式写入。

所有电表数据都往一张表里面写入。

电表编号 时间 正向有功总电量
d1 2022/09/18 00:15:00 0
d1 2022/09/18 02:15:00 0.11
d2 2022/09/18 00:15:00 10
d2 2022/09/18 02:15:00 20.2

至于电表的静态数据,无需存入到InfluxDB数据库中,可以存入MySQL关系型数据库。

因为这些静态数据如果存入InfluxDB数据库,则很浪费资源。

电表属性表

电表编号 电表位置 电表类型 分组编号
d1 福建省厦门市 1 1
d2 福建省福州市 1 1

九、总结

实话实说,InfluxDB概念更加简单,上手更快。具体可以参考:InfluxDB入门系列教程① 概念简介

TDengine主要是引入了超级表和子表的概念,有点绕,不是那么好理解。

理解清楚了,倒也还好。据说这么设计得目的是:采用一个数据采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的。

有实际的存在意义,倒也说得过去。