如何设计时序数据表

时序数据表可以为您提高查询和存储性能,本文介绍如何根据时序数据的来源和场景建立时序数据表。

时序数据示例

时序数据建模至关重要,需要仔细分析数据来源的特性和查询的场景,建立合理的数据表,以便达到最佳的存储和查询性能。以下图的空气检测数据为例:

时序数据模型

每个时间点对应的数据记录可以详细分为几个部分:

  • 表 (Table):代表一系列同类时序数据的集合。

  • 标签(Tags):表明指标项监测针对的具体对象属性。其中一个标签(Tag)由一个标签键(Key)和一个对应的标签值(Value)组成。时序引擎默认会为每一个标签的健-值对都建立 标签与时间序列之间的索引。在特定场合下,标签也可能会有不同的叫法,比如可能被称为 Labels 或者 Dimensions。

  • 时间戳(Timestamp):表示该数据记录对应的生成时间。

  • 字段(Field):一条数据记录可以有多个字段值,表示指标的不同方面。时序引擎不会为字段建立索引。

表设计的最佳实践

基于以上的数据模型,我们便可以将同一类时序数据的度量(如上图中的AQM)设计为表名,并按照TSQL的CREATE TABLE 语法进行表设计。

以上文的空气质量监测的时序模型为例,可以采用的表定义如下所示。

CREATE TABLE aqm (
    city        VARCHAR TAG,
    district   VARCHAR TAG,
    id          VARCHAR TAG,
    time      TIMESTAMP,
    pm2_5   DOUBLE,
    pm10     DOUBLE,
    so2       DOUBLE,
    no2       DOUBLE
);

在此定义基础上,随后向表中写数据便可通过INSERT语句来进行:

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:00:00', 31.0, 66.0, 10.0, 43.0);

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:01:00', 31.2, 66.0, 10.5, 43.1);

也可以通过下述INSERT语句实现批量写入数据

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:02:00', 31.3, 66.0, 10.0, 42.9),  
('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:03:00', 31.2, 66.4, 10.3, 43.0);

说明

关键字TAG是TSQL中的语法扩展,用于将表中的部分列标示为“标签”。为避免在时序数据建表的过程中纠结于应该将哪些字段应定义为TAG,建议尝试遵循以下原则:

  • 能够标示数据采集源属性的字段定义为TAG,特别是能够唯一标示数据源的属性。

  • 应避免使用进程ID, 时间关联属性等易变值作为标签,即便这类属性的类型是字符串,仍然建议将其定义为Field。如果使用此类易变属性作为标签,将会导致时间线数量急剧膨胀,并带来时间线索引大小剧增,反而不利于查询。