时序数据库IoTDB数据模型建模实例详解
一、引言
本文旨在通过具体实例详细介绍IoTDB(Internet of Things Database)的数据模型建模方法,以解决部分用户对实际系统建模的困惑。IoTDB作为一种时间序列数据库,其数据模型与实时库、InfluxDB、OpenTSDB等基于标签的模型有所不同。
二、基于标签的模型概述
在实时库、InfluxDB、OpenTSDB等数据库中,每个测点通常有一个由符号"."连接的多个属性值组成的名称(标签)。例如,在电厂应用中,测点名称可能是“电厂名称.机组.测点编码”。如果将所有测点的数据理解成一张表,则时间和测点名称构成联合主键。在InfluxDB和OpenTSDB中,每条数据包含tag和field的概念,上述数据通常被定义为3个tag和1个field,时间和所有tag列构成联合主键。
三、IoTDB数据模型介绍
IoTDB中的时间序列定义为一个测点不断采集数据,每个数据点带有时间戳,形成一条时间序列。IoTDB的目标场景是管理大量这种时间序列,每个时间序列由路径唯一定位。路径形成树形元数据结构,其中从根节点到倒数第二级的路径代表设备。同一设备的多个测点可以共享一个时间戳写入。
错误建模示例:
在IoTDB中,如果将Tag的名称定义为一个时间序列,并将Tag值存储为这个时间序列的值,会导致同一个时间序列的同一个时间戳只保留最后写入的点。例如,建立以下两条时间序列(root.sg.taga, root.sg.value),并用来存储多个测点(a1, b1, c1)的值,是错误的建模方式。
正确建模示例:
应为每个测点创建单独的时间序列,如root.sg.a1, root.sg.b1, root.sg.c1。这样,每个序列的数据可以独立存储和查询。
四、IoTDB查询介绍
IoTDB提供了灵活的查询方式,可以根据路径匹配到所有时间序列,并按照不同的对齐方式展示成一张表。对齐方式包括:
- 按照Time对齐(默认):根据select和from子句中的路径找到所有匹配的时间序列,按时间顺序展示。
- 按照设备表展示:使用align by device语句,按时间和设备对齐,空值展示为null。
- 不对齐:每个时间序列独立展示,每个序列有两列(时间列和值列),使用disable align修饰。
五、树形模型的灵活性
IoTDB的树形模型具有高度的灵活性。例如,一个电厂有3个设备,每个设备的发电量是一个时间序列,可以创建3个序列:root.电厂1.设备1.发电量,root.电厂1.设备2.发电量,root.电厂1.设备3.发电量。如果需要增加一个电厂总发电量,只需在电厂下一级增加一个时间序列:root.电厂1.总发电量。
六、与其他模型的比较
与采用关系模型的时序数据库(如TimescaleDB)相比,IoTDB的树形模型具有更高的灵活性,适用于测点数量不确定、设备测点不同时采集的场景。然而,关系模型的学习成本较低,适用于数据较为规整的场景。因此,在选择数据库时,需要根据具体应用场景和需求进行权衡。
七、结语
IoTDB作为一种高效的时间序列数据库,其树形数据模型为大规模时间序列数据的存储和查询提供了有力支持。本文通过具体实例详细介绍了IoTDB的建模方法和查询方式,希望能够帮助用户更好地理解和应用IoTDB。