时序数据库作为处理时间序列数据的专业数据库类型,其数据模型设计直接决定了数据存储效率和查询性能。本文将深入解析时序数据库的核心数据模型概念,帮助开发者理解时序数据的组织方式。
一、时序数据的基本概念
为了清晰地阐述时序数据的基本概念,我们以智能电表为例,探讨时序数据的典型应用场景。设想有一种型号的智能电表,它能够采集电流、电压和相位这3个模拟量,此外还具有位置和分组等静态属性。
| Device ID | Timestamp | Current | Voltage | Phase | Location | Group ID |
|---|---|---|---|---|---|---|
| d1001 | 1538548685000 | 10.3 | 219 | 0.31 | California.SanFrancisco | 2 |
| d1002 | 1538548684000 | 10.2 | 220 | 0.23 | California.SanFrancisco | 3 |
| d1003 | 1538548686500 | 11.5 | 221 | 0.35 | California.LosAngeles | 3 |
上表展示了各设备ID对应的智能电表在特定时刻采集的物理量数据,涵盖电流、电压和相位等重要信息。这些数据构成了典型的时序数据结构。
二、采集量:时序数据的核心要素
采集量是指通过各种传感器、设备或其他类型的采集点所获取的物理量,如电流、电压、温度、压力、GPS等。由于这些物理量随时间不断变化,因此采集的数据类型多样,包括整型、浮点型、布尔型以及字符串等。
随着时间的积累,存储的采集量数据将持续增长。以智能电表为例,其中的current、voltage和phase便是典型的采集量。采集量具有以下特征:
- 时变性:采集量的值随时间变化
- 连续性:数据按时间顺序持续产生
- 大量性:长期积累后数据量巨大
三、标签:静态属性的载体
标签是指附着在传感器、设备或其他类型采集点上的静态属性,这些属性不会随时间发生变化,例如设备型号、颜色、设备所在地等。标签的数据类型可以是任意类型。
与采集量不同,随着时间的推移,存储的标签数据量保持相对稳定,不会呈现明显的增长趋势。在智能电表的示例中,location和Group ID就是典型的标签。
标签虽然本身是静态的,但在实际应用中,用户可能需要对标签进行修改、删除或添加操作,这为数据管理提供了灵活性。
四、数据采集点:数据产生的源头
数据采集点是指在一定的预设时间周期内或受到特定事件触发时,负责采集物理量的硬件或软件设备。一个数据采集点可以同时采集一个或多个采集量,但这些采集量都是在同一时刻获取的,并拥有相同的时间戳。
对于结构复杂的设备,通常会有多个数据采集点,每个数据采集点的采集周期可能各不相同,它们之间完全独立,互不干扰。以一辆汽车为例:
- GPS数据采集点:负责采集位置信息
- 发动机监控采集点:负责监控发动机状态
- 车内环境采集点:专注于车内环境的监测
五、表:时序数据的基本存储单元
鉴于采集的数据通常是结构化数据,为了降低用户的学习难度,时序数据库采用传统的关系型数据库模型来管理数据。同时,为了充分发挥时序数据的特性,采取了”一个数据采集点一张表”的设计策略。
5.1 “一个采集点一张表”的设计优势
这种设计方式有几大优点:
- 写入性能提升:由于不同数据采集点产生数据的过程完全独立,每个数据采集点的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写数据,写入速度能大幅提升。
- 追加式写入:对于一个数据采集点而言,其产生的数据是按照时间递增的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。
- 读取效率优化:一个数据采集点的数据是以块为单位连续存储的,每次读取一个时间段的数据,能大幅减少随机读取操作,成数量级的提升读取和查询速度。
- 高压缩率:一个数据块内部采用列式存储,对于不同的数据类型,可以采用不同压缩算法来提高压缩率。由于采集量的变化通常是缓慢的,压缩率会更高。
5.2 表结构设计
在时序数据库中,通常使用数据采集点的名称来做表名,每个数据采集点可以有多个采集量,每个采集量对应一张表的一列。表的第一列必须是时间戳,即数据类型为Timestamp。
六、超级表:同类数据的统一模板
当设备数量不断增加,表的数量也会急剧增加,这给表的管理以及表之间的聚合带来了巨大的挑战。为了解决这个问题,时序数据库引入超级表(Super Table,简称为STable)的概念。
超级表是一种数据结构,它能将某一特定类型的数据采集点聚集在一起,形成一张逻辑上的统一表。这些数据采集点具有相同的表结构,但各自的静态属性(如标签)可能不同。
创建超级表时,除了定义采集量的结构之外,还需定义超级表的标签。一张超级表至少包含:
- 一个时间戳列
- 一个或多个采集量列
- 一个或多个标签列
七、子表:超级表的具体实例
子表是数据采集点在逻辑上的一种抽象表示,它是隶属于某张超级表的具体表。用户可以将超级表的定义作为模板,并通过指定子表的标签值来创建子表。
超级表与子表之间的关系主要体现在以下几个方面:
- 一张超级表包含多张子表,这些子表具有相同的表结构,但标签值各异
- 子表的表结构不能直接修改,但可以修改超级表的列和标签,且修改对所有子表立即生效
- 超级表定义了一个模板,自身并不存储任何数据或标签信息
八、库:数据管理的逻辑容器
库是时序数据库中用于管理一组表的集合。一个运行实例可以包含多个库,并且每个库都可以配置不同的存储策略。
由于不同类型的数据采集点通常具有不同的数据特征,如数据采集频率、数据保留期限、副本数量、数据块大小等,建议将具有不同数据特征的超级表创建在不同的库中,以确保数据库能够发挥最大效率。
总结
时序数据库的数据模型设计充分考虑了时序数据的特点,通过采集量、标签、表、超级表、子表等概念的有机结合,实现了高效的数据存储和查询。”一个数据采集点一张表”的设计理念,配合超级表模板机制,既保证了单个采集点的最优性能,又简化了大量设备的管理复杂度。TDengine作为专业的时序数据库产品,完整实现了这些核心概念,为物联网和工业场景提供了高效的数据管理解决方案。

























