TDengine Community 超级表建表实战:统一21个TAG与DOUBLE/字符串数据模板

一、背景

在数据中台时序数据接入过程中,不同测点的数据类型虽然不同,但设备、区域、系统、点位等业务属性基本一致。

因此可以采用 TDengine 超级表统一建模:

复制代码
时间字段
+
数据值
+
质量码
+
固定业务 TAG

本项目约定所有超级表统一采用:

复制代码
time
val
quality
21 个标准 TAG

不同类型超级表之间,主要区别是:

复制代码
超级表名称
val 字段的数据类型

其余 TAG:

复制代码
字段名称
字段类型
字段长度
字段顺序

统一管理,避免不同开发人员各自建表导致结构不一致。


二、超级表基础结构

统一结构如下:

复制代码
CREATE STABLE IF NOT EXISTS `<数据库名>`.`<超级表名>`
(
    `time`    TIMESTAMP,
    `val`     <数据类型>,
    `quality` INT
)
TAGS
(
    ...
);

三个核心数据字段:

字段 类型 说明
time TIMESTAMP 数据采集时间
val 按业务定义 实际测点值
quality INT 数据质量码

其中:

复制代码
time、quality 固定
val 根据实际数据类型调整

三、21 个标准 TAG 字段

业务手册已经明确规定超级表 TAG 字段名称及目标长度,例如 device_name=300、variable_name=300、industrial_park=300、description=400 等。

最终统一定义如下:

复制代码
TAGS
(
    `device_name`      NCHAR(300),
    `variable_name`    NCHAR(300),
    `company`          NCHAR(200),
    `region`           NCHAR(200),
    `country`          NCHAR(200),
    `province`         NCHAR(200),
    `county`           NCHAR(100),
    `industrial_park`  NCHAR(300),
    `industry`         NCHAR(100),
    `product_type`     NCHAR(300),

    `system_code`      VARCHAR(200),
    `operation`        VARCHAR(100),
    `area_code`        VARCHAR(100),
    `subsys_code`      VARCHAR(200),
    `unit_code`        VARCHAR(200),
    `system_path`      VARCHAR(100),
    `point_code`       VARCHAR(100),
    `description`      VARCHAR(400),
    `unit`             VARCHAR(100),
    `data_type`        VARCHAR(100),
    `data_class`       VARCHAR(100)
);

需要特别注意:

复制代码
data_type

使用下划线,不是:

复制代码
data type

四、统一超级表建表模板

开发人员实际使用时,只需要替换三个位置:

复制代码
<数据库名>
<超级表名>
<数据类型>

标准模板:

复制代码
CREATE STABLE IF NOT EXISTS `<数据库名>`.`<超级表名>`
(
    `time`    TIMESTAMP,
    `val`     <数据类型>,
    `quality` INT
)
TAGS
(
    `device_name`      NCHAR(300),
    `variable_name`    NCHAR(300),
    `company`          NCHAR(200),
    `region`           NCHAR(200),
    `country`          NCHAR(200),
    `province`         NCHAR(200),
    `county`           NCHAR(100),
    `industrial_park`  NCHAR(300),
    `industry`         NCHAR(100),
    `product_type`     NCHAR(300),
    `system_code`      VARCHAR(200),
    `operation`        VARCHAR(100),
    `area_code`        VARCHAR(100),
    `subsys_code`      VARCHAR(200),
    `unit_code`        VARCHAR(200),
    `system_path`      VARCHAR(100),
    `point_code`       VARCHAR(100),
    `description`      VARCHAR(400),
    `unit`             VARCHAR(100),
    `data_type`        VARCHAR(100),
    `data_class`       VARCHAR(100)
);

五、DOUBLE 类型超级表示例

如果项目数值型数据统一采用 DOUBLE,例如:

复制代码
温度
压力
流量
电流
电压
频率
百分比

可以建立:

复制代码
CREATE STABLE IF NOT EXISTS `iot`.`sjcj_fd_double`
(
    `time`    TIMESTAMP,
    `val`     DOUBLE,
    `quality` INT
)
TAGS
(
    `device_name`      NCHAR(300),
    `variable_name`    NCHAR(300),
    `company`          NCHAR(200),
    `region`           NCHAR(200),
    `country`          NCHAR(200),
    `province`         NCHAR(200),
    `county`           NCHAR(100),
    `industrial_park`  NCHAR(300),
    `industry`         NCHAR(100),
    `product_type`     NCHAR(300),
    `system_code`      VARCHAR(200),
    `operation`        VARCHAR(100),
    `area_code`        VARCHAR(100),
    `subsys_code`      VARCHAR(200),
    `unit_code`        VARCHAR(200),
    `system_path`      VARCHAR(100),
    `point_code`       VARCHAR(100),
    `description`      VARCHAR(400),
    `unit`             VARCHAR(100),
    `data_type`        VARCHAR(100),
    `data_class`       VARCHAR(100)
);

对应关系:

复制代码
超级表:sjcj_fd_double
val:DOUBLE

六、字符串类型超级表示例

如果业务侧将字符串类型统一抽象为:

复制代码
str

TDengine 建表时需要落到实际数据库字符串类型,例如项目约定使用:

复制代码
VARCHAR(128)

模板:

复制代码
CREATE STABLE IF NOT EXISTS `iot`.`sjcj_fd_varchar128`
(
    `time`    TIMESTAMP,
    `val`     VARCHAR(128),
    `quality` INT
)
TAGS
(
    `device_name`      NCHAR(300),
    `variable_name`    NCHAR(300),
    `company`          NCHAR(200),
    `region`           NCHAR(200),
    `country`          NCHAR(200),
    `province`         NCHAR(200),
    `county`           NCHAR(100),
    `industrial_park`  NCHAR(300),
    `industry`         NCHAR(100),
    `product_type`     NCHAR(300),
    `system_code`      VARCHAR(200),
    `operation`        VARCHAR(100),
    `area_code`        VARCHAR(100),
    `subsys_code`      VARCHAR(200),
    `unit_code`        VARCHAR(200),
    `system_path`      VARCHAR(100),
    `point_code`       VARCHAR(100),
    `description`      VARCHAR(400),
    `unit`             VARCHAR(100),
    `data_type`        VARCHAR(100),
    `data_class`       VARCHAR(100)
);

项目内部如果把业务类型定义成:

复制代码
double
str

需要注意:

double / str 可以作为业务数据类型分类,但建表 SQL 中仍然需要使用 TDengine 实际支持的数据类型,例如 DOUBLE、VARCHAR(128) 等。


七、如果仍需要 FLOAT / INT

如果旧系统还有 FLOAT 或 INT 类型,也可以沿用完全相同的 TAG 模板。

FLOAT

复制代码
CREATE STABLE IF NOT EXISTS `iot`.`sjcj_fd_float`
(
    `time`    TIMESTAMP,
    `val`     FLOAT,
    `quality` INT
)
TAGS
(
    -- 21个标准TAG,保持不变
);

INT

复制代码
CREATE STABLE IF NOT EXISTS `iot`.`sjcj_fd_int`
(
    `time`    TIMESTAMP,
    `val`     INT,
    `quality` INT
)
TAGS
(
    -- 21个标准TAG,保持不变
);

因此实际设计原则不是"每种数据类型重新设计一套表",而是:

复制代码
同一套TAG
   +
不同val类型

八、建表完成后的检查

查看超级表:

复制代码
SHOW STABLES;

检查字段定义:

复制代码
DESCRIBE iot.sjcj_fd_double;

查看完整建表 SQL:

复制代码
SHOW CREATE STABLE iot.sjcj_fd_double;

重点核对:

复制代码
time
val
quality

以及:

复制代码
21个TAG字段名称
TAG类型
TAG长度
TAG顺序

尤其确认:

复制代码
data_type

没有误写成其他名称。


九、开发使用规范

建议项目内部直接统一以下规则:

  1. 所有时序业务超级表统一使用 time + val + quality + 21个标准TAG。

  2. 21 个 TAG 的字段名称、字段类型、字段长度和顺序统一管理,不允许开发自行调整。

  3. 不同数据类型只允许修改超级表名称和 val 字段类型。

  4. 当前项目如统一采用 double / str 两类业务数据,应分别映射到数据库实际数据类型,例如 DOUBLE 和 VARCHAR(128)。

  5. 新建超级表后必须执行 DESCRIBE 和 SHOW CREATE STABLE 进行结构核验。


十、总结

超级表统一后,数据模型就非常清晰:

复制代码
                 超级表
                    │
      ┌─────────────┼─────────────┐
      │             │             │
    time           val        quality
 TIMESTAMP       业务数据        INT
                    │
          ┌─────────┴─────────┐
        DOUBLE           VARCHAR
                    │
                    ↓
             21 个统一 TAG

这样做最大的价值是:

复制代码
字段统一
结构统一
开发规范统一
数据接入统一
后期扩展简单
运维维护方便

以后增加新的数据类型,也不需要重新设计 TAG,只需确定新的:

复制代码
超级表名称
+
val 数据类型

即可。

相关推荐
高山有多高1 小时前
【Linux笔记】冯诺依曼体系结构
linux·运维·笔记
katasea2 小时前
第05章:信创技术栈选型:服务器、操作系统、数据库、中间件适配对比
服务器·数据库·中间件
筑梦之路2 小时前
Alibaba Cloud Linux 4 IPXE全自动安装(直连官方源)——筑梦之路
linux·运维·服务器·国产化·阿里云操作系统
梓沂2 小时前
记一次 Oracle 测试库自动刷新脚本的踩坑实录
数据库·oracle
2501_931803752 小时前
MySQL 索引核心原理
数据库·mysql
Pointer Pursuit2 小时前
make / Makefile
linux·运维·服务器
ZhangJun952 小时前
Linux常用命令笔记,中高级运维高频指令,并附上vim常见操作
linux·运维·centos·云计算·vim
浪潮IT馆2 小时前
Windows 10 安装 PostgreSQL 9.6.24 完整教程
数据库·windows·postgresql
成为深度学习高手2 小时前
DAG:沿时间与通道双相关建模的外生变量时序预测
网络·人工智能·深度学习·算法·机器学习·数据挖掘·时序数据库