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

即可。

相关推荐
修己xj21 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
这个DBA有点耶21 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
SelectDB1 天前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹1 天前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
爱吃奥利奥_wen1 天前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
这个DBA有点耶1 天前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
测试界的小码农1 天前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j
xbzb1 天前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮1 天前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频