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

即可。

相关推荐
SelectDB1 小时前
开源替代怎么选:能力对照、三条部署路径与四类边界速查
数据库·云原生·开源
SelectDB1 小时前
自建与托管怎么选:开源自建、私有化与云上托管三条路径速查
数据库·云原生·开源
这个DBA有点耶1 小时前
深入 OLTP 锁与并发:从行锁到分布式事务的一致性权衡
数据库·架构·产品
SelectDB1 小时前
数仓 TCO 怎么算:五项成本拆解框架速查
大数据·数据库·开源
虚拟世界AI1 小时前
Kronos 时间序列数据库新手部署与实战指南
数据库
fengkai45451 小时前
3、Kubernetes的Namespace&Contexts&Pod&YAML格式
运维·容器·kubernetes·k8s·namespace·yaml·pod
2401_868534782 小时前
局域网络中信息安全方案设计及攻击防范技术(制造企业园区网)
服务器·网络
愤怒火龙果2 小时前
AI攻防 AIRT03-RAG Exploitation & Vector Database Attacks
数据库·人工智能·网络安全
戴西软件2 小时前
制造研发中的AI视觉与仿真:戴西工程图纸智能审图智能体、戴西3DViz_CAE AI集成与戴西3DViz_CAD AI集成
大数据·运维·人工智能·3d·自动化·制造·rpa
SelectDB2 小时前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析