news 2026/10/1 20:11:05

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 ( ... );

三个核心数据字段:

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

其中:

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 数据类型

即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 20:09:30

Linux 下启动 Redis 的正确姿势:从安装到守护进程的完整指南

我第一次在 Linux 服务器上启动 Redis 的场景&#xff0c;现在想起来还挺狼狈的。当时我照着教程敲了个redis-server&#xff0c;看到屏幕上刷出一大串日志&#xff0c;心想“成了”&#xff0c;转头就把终端关了。结果第二天同事问我 Redis 怎么挂了——我就愣在那儿。后来我才…

作者头像 李华
网站建设 2026/10/1 20:07:37

云代理商实战:云端部署的 Hermes Agent 接入 Slack 的网关配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 20:05:18

【claude code实践】Plugins 入门:扩展 Claude Code 的工具生态

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 20:05:18

盘立方软件指标公式倚天财经指标公式

HH:HHV(HIGH,10); LL:LLV(LOW,10); HH1:BARSLAST((HH>REF(HH,1))); LL1:BARSLAST((LL < REF(LL,1))); DRAWTEXT(CROSS(HH1,LL1),90,众),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),90,2),COLORYELLOW; DRAWTEXT(CROSS(HH1,LL1),60,龙),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),60…

作者头像 李华