指标数据逻辑存储模型
常见的时序数据库的数据模型,主要分成单值模型和多值模型
单值模型是根据业务指标数据建模,按照单个指标的细粒度进行数据使用和逻辑存储,如下所示,一行数据只有一个指标值,即value列。目前采用单值模型的时序数据库,有OpenTSDB、 KairosDB、Prometheus等。
1 | 单值模型: |
多值的模型则是针对数据源建模,我们每一行数据针对的是一个数据源,它的被测量的多个指标在同一列上,如下所示,一行数据有多个指标值,即有cpu和io两列。目前采用多值模型的时序数据库,有InfluxDB、TimescaleDB等。
1 | 多值模型: |
可以把两者理解为:
- 单值模型:一条时序记录只描述一个指标。
- 多值模型:一条时序记录同时描述同一数据源在同一时刻的多个指标。
严格来说,多值模型中的多个指标是放在同一行的不同列/字段中,而不是同一列。

对比
| 对比维度 | 单值模型 | 多值模型 |
|---|---|---|
| 建模中心 | 指标/时间序列 | 数据源/实体 |
| 数据结构 | 固定的 value 列,指标名作为标签或表名 |
每个指标对应一个字段/列 |
| 写入效率 | 一次采集多个指标时需要写多条记录 | 多个指标可合并为一条记录,通常更高效 |
| 存储效率 | 重复保存时间戳、标签,开销可能较大 | 共享时间戳和标签,相关指标密集时更省空间 |
| 单指标查询 | 简单直接,通常性能较好 | 只读取一列即可,但受数据库列存储方式影响 |
| 多指标联合查询 | 需要按时间和标签对齐、关联 | 同行天然对齐,查询更方便 |
| 指标动态扩展 | 非常灵活,新增指标一般无需改表结构 | 可能需要新增字段或列,依赖数据库对动态字段的支持 |
| 稀疏数据 | 适合,各指标可以独立上报 | 容易产生大量空值或频繁的部分字段更新 |
| 数据类型 | 同一序列通常只有一种值类型 | 不同字段可以使用不同数据类型 |
| 数据一致性 | 多个指标分别写入,时间可能不完全一致 | 同一行的多个指标可作为一个采集快照写入 |
| 基数管理 | 指标和标签组合容易形成大量时间序列 | 时间序列数量可能较少,但字段数量可能膨胀 |
单值模型优劣势
优势
- 指标扩展灵活
新增指标时,只需产生一个新的时间序列,不必修改表结构。特别适合指标种类动态变化、不同设备上报指标不一致的场景。
- 稀疏数据处理自然
CPU 指标每秒上报、温度每分钟上报,也可以各自独立存储,不需要人为对齐时间,更不会产生大量空字段。
- 单指标查询和聚合简单
例如查询所有主机的 cpu_usage,可以直接针对该指标的时间序列进行扫描和聚合。
- 数据模型统一
无论 CPU、延迟、请求数还是温度,都可以用:
1 | 时间戳 + 标签集合 + 指标值 |
统一表示,采集、传输和存储链路比较通用。
劣势
- 多指标写入存在重复
同一设备同一时刻采集 CPU、内存、IO 时,需要写入多条记录,其中时间戳和标签会重复。
多指标关联比较复杂
如果要计算:
1
CPU 使用率 / IO 使用率
需要把两个时间序列按设备和时间对齐。遇到采样时间不同、数据缺失时,还要处理插值、窗口匹配等问题。
难以表达完整快照
分别写入的 CPU 和 IO 指标不一定来自同一次采集,也不一定具有事务一致性。
多值模型的优劣势
优势
- 批量写入效率高
一次设备采集可以作为一行写入,时间戳和标签只需保存一次:
1 | time + host + cpu + memory + io + temperature |
- 相关指标天然对齐
同一行的数据一般表示同一数据源在同一时刻的完整快照,适合做跨指标计算和关联分析。
- 密集数据存储更高效
如果同一数据源的大部分指标都会同时上报,多值模型可以减少时间戳、设备标识和标签的重复。
- 更接近关系型查询习惯
可以直接写出类似:
1 | SELECT time, cpu_usage, io_usage |
跨字段计算也很自然。
劣势
- 不适合高度动态的指标集合
如果设备频繁增加新的指标,可能造成字段持续增加、表结构频繁变化或产生大量动态字段。
- 稀疏数据可能浪费空间
不同指标采样周期不同,或者不同设备支持的指标不同,就可能出现大量空值:
1 | time cpu io temperature voltage |
具体浪费程度取决于数据库对空值和列式压缩的处理能力。
- 宽表管理困难
当指标达到数百甚至数千个时,会形成宽表,影响元数据管理、查询规划、数据迁移和模式演进。
- 单个字段更新可能更复杂
如果 CPU 每秒上报,而温度每分钟上报,需要选择保留旧值、写空值、部分更新或拆成多个测量表。
如何选择
适合单值模型的情况:
- 指标经常动态增加或删除;
- 不同数据源的指标集合差异很大;
- 指标采样周期不同;
- 查询以单指标聚合、监控和告警为主;
- 数据高度稀疏;
- 需要类似 Prometheus 的标签化指标体系。
适合多值模型的情况:
- 同一数据源会同时采集多个固定指标;
- 经常进行跨指标计算和关联分析;
- 指标集合相对稳定;
- 希望获得较高的批量写入效率;
- 需要保留设备在某一时刻的完整快照;
- 更习惯 SQL 和宽表分析。
实际系统通常会混合建模:把采集频率相同、业务相关且通常同时上报的指标放入一个多值表;把动态、稀疏或采样周期差异较大的指标拆开。相比纯粹选择单值或多值,这种做法往往更实用。