当前位置: 首页 > news >正文

tdengine学习笔记-建库和建表

目录

建库和建表

创建超级表​

创建表​

自动建表​

创建普通表​

多列模型 VS 单列模型​

数据类型映射​

示例程序汇总​

在车联网领域的应用

1. 数据模型概述

2. 表结构设计

2.1 静态数据表

2.2 动态数据表

4. 查询数据

4.1 查询单个车辆的数据

4.2 查询多个车辆的数据

4.3 聚合查询

5. 性能优化

6. 安全性和监控


建库和建表

创建数据库

创建一个数据库以存储电表数据的 SQL 如下:

CREATE DATABASE power PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 16;

该 SQL 将创建一个名为 power 的数据库,各参数说明如下:

  • PRECISION 'ms' :这个数据库的时序数据使用毫秒(ms)精度的时间戳
  • KEEP 3650:这个库的数据将保留 3650 天,超过 3650 天的数据将被自动删除
  • DURATION 10 :每 10 天的数据放在一个数据文件中
  • BUFFER 16 :写入使用大小为 16MB 的内存池。

 注意:KEEP 3650这个日期影响着后面插入的时间,如果后面插入的时间戳早于这个时间将会报错

 Timestamp data out of range

在创建power数据库后,可以执行 USE 语句来使用切换数据库。

use power;

该 SQL 将当前数据库切换为 power,表示之后的插入、查询等操作,都在当前的 power 数据库中进行。

创建超级表​

创建一张名为 meters 的超级表的 SQL 如下:

CREATE STABLE meters (ts timestamp, current float, voltage int, phase float
) TAGS (location varchar(64), group_id int
);

在 TDengine 中,创建超级表的 SQL 语句与关系型数据库类似。例如,上面的 SQL 中,CREATE STABLE 为关键字,表示创建超级表;接着,meters 是超级表的名称;在表名后面的括号中,定义超级表的列(列名、数据类型等),规则如下:

  1. 第 1 列必须为时间戳列。例如:ts timestamp 表示,时间戳列名是 ts,数据类型为 timestamp
  2. 从第 2 列开始是采集量列。采集量的数据类型可以为整型、浮点型、字符串等。例如:current float 表示,采集量电流 current,数据类型为 float

最后,TAGS是关键字,表示标签,在 TAGS 后面的括号中,定义超级表的标签(标签名、数据类型等)。

  1. 标签的数据类型可以为整型、浮点型、字符串等。例如:location varchar(64) 表示,标签地区 location,数据类型为 varchar(64)
  2. 标签的名称不能与采集量列的名称相同。

创建表​

通过超级表创建子表 d1001 的 SQL 如下:

CREATE TABLE d1001 
USING meters (location,group_id
) TAGS ("California.SanFrancisco", 2
);

上面的 SQL 中,CREATE TABLE 为关键字,表示创建表;d1001 是子表的名称;USING 是关键字,表示要使用超级表作为模版;meters 是超级表的名称;在超级表名后的括号中,locationgroup_id 表示,是超级表的标签列名列表;TAGS 是关键字,在后面的括号中指定子表的标签列的值。"California.SanFrancisco" 和 2 表示子表 d1001 的位置为 California.SanFrancisco,分组 ID 为 2 。

当对超级表进行写入或查询操作时,用户可以使用伪列 tbname 来指定或输出对应操作的子表名

自动建表​

在 TDengine 中,为了简化用户操作并确保数据的顺利写入,即使子表尚不存在,用户也可以使用带有 using 关键字的自动建表 SQL 进行数据写入。这种机制允许系统在遇到不存在的子表时,自动创建该子表,然后再执行数据写入操作。如果子表已经存在,系统则会直接写入数据,不需要任何额外的步骤。

在写入数据的同时自动建表的 SQL 如下:

INSERT INTO d1002 
USING meters 
TAGS ("California.SanFrancisco", 2
) VALUES (NOW, 10.2, 219, 0.32
);

上面的 SQL 中,INSERT INTO d1002 表示,向子表 d1002 中写入数据;USING meters 表示,使用超级表 meters 作为模版;TAGS ("California.SanFrancisco", 2) 表示,子表 d1002 的标签值分别为 California.SanFrancisco 和 2VALUES (NOW, 10.2, 219, 0.32) 表示,向子表 d1002 插入一行记录,值分别为NOW(当前时间戳)、10.2(电流)、219(电压)、0.32(相位)。在 TDengine 执行这条 SQL 时,如果子表 d1002 已经存在,则直接写入数据;当子表 d1002 不存在,会先自动创建子表,再写入数据。

创建普通表​

在 TDengine 中,除了具有标签的子表以外,还存在一种不带任何标签的普通表。这类表与普通关系型数据库中的表相似,用户可以使用 SQL 创建它们。

普通表与子表的区别在于:

  1. 标签扩展性:子表在普通表的基础上增加了静态标签,这使得子表能够携带更多的元数据信息。此外,子表的标签是可变的,用户可以根据需要增加、删除或修改标签。
  2. 表归属:子表总是隶属于某张超级表,它们是超级表的一部分。而普通表则独立存在,不属于任何超级表。
  3. 转换限制:在 TDengine 中,普通表无法直接转换为子表,同样,子表也无法转换为普通表。这两种表类型在创建时就确定了它们的结构和属性,后期无法更改。

总结来说,普通表提供了类似于传统关系型数据库的表功能,而子表则通过引入标签机制,为时序数据提供了更丰富的描述能力和更灵活的管理方式。用户可以根据实际需求选择创建普通表还是子表。

创建不带任何标签的普通表的 SQL 如下:

CREATE TABLE d1003(ts timestamp,current float, voltage int, phase float,location varchar(64), group_id int
);

上面的 SQL 表示,创建普通表 d1003 ,表结构包括 tscurrentvoltagephaselocationgroup_id,共 6 个列。这样的数据模型,与关系型数据库完全一致。

采用普通表作为数据模型意味着静态标签数据(如 location 和 group_id)会重复存储在表的每一行中。这种做法不仅增加了存储空间的消耗,而且在进行查询时,由于无法直接利用标签数据进行过滤,查询性能会显著低于使用超级表的数据模型。

多列模型 VS 单列模型​

TDengine 支持灵活的数据模型设计,包括多列模型和单列模型。多列模型允许将多个由同一数据采集点同时采集且时间戳一致的物理量作为不同列存储在同一张超级表中。然而,在某些极端情况下,可能会采用单列模型,即每个采集的物理量都单独建立一张表。例如,对于电流、电压和相位这 3 种物理量,可能会分别建立 3 张超级表。

尽管 TDengine 推荐使用多列模型,因为这种模型在写入效率和存储效率方面通常更优,但在某些特定场景下,单列模型可能更为适用。例如,当一个数据采集点的采集量种类经常发生变化时,如果采用多列模型,就需要频繁修改超级表的结构定义,这会增加应用程序的复杂性。在这种情况下,采用单列模型可以简化应用程序的设计和管理,因为它允许独立地管理和扩展每个物理量的超级表。

总之,TDengine 提供了灵活的数据模型选项,用户可以根据实际需求和场景选择最适合的模型,以优化性能和管理复杂性。

数据类型映射​

TDengine 目前支持时间戳、数字、字符、布尔类型,与 Java 对应类型转换如下:

TDengine DataTypeJDBCType
TIMESTAMPjava.sql.Timestamp
INTjava.lang.Integer
BIGINTjava.lang.Long
FLOATjava.lang.Float
DOUBLEjava.lang.Double
SMALLINTjava.lang.Short
TINYINTjava.lang.Byte
BOOLjava.lang.Boolean
BINARYbyte array
NCHARjava.lang.String
JSONjava.lang.String
VARBINARYbyte[]
GEOMETRYbyte[]

注意:JSON 类型仅在 tag 中支持。
由于历史原因,TDengine中的BINARY底层不是真正的二进制数据,已不建议使用。请用VARBINARY类型代替。
GEOMETRY类型是little endian字节序的二进制数据,符合WKB规范。详细信息请参考 数据类型
WKB规范请参考Well-Known Binary (WKB)
对于java连接器,可以使用jts库来方便的创建GEOMETRY类型对象,序列化后写入TDengine,这里有一个样例Geometry示例

示例程序汇总​

示例程序源码位于 TDengine/docs/examples/JDBC 下:

  • JDBCDemo:JDBC 示例源程序。
  • connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
  • SpringJdbcTemplate:Spring JdbcTemplate 中使用 taos-jdbcdriver。
  • mybatisplus-demo:Springboot + Mybatis 中使用 taos-jdbcdriver。
  • springbootdemo: Springboot 中使用 taos-jdbcdriver。
  • consumer-demo:Consumer 消费 TDengine 数据示例,可通过参数控制消费速度。

请参考:JDBC example

在车联网领域的应用

设计车联网数据在TDengine时序数据库中的表结构时,需要考虑以下几个关键因素:数据的类型、频率、存储效率以及查询性能。TDengine 是一个专为物联网(IoT)和时序数据设计的高性能时序数据库,特别适合处理大规模的时序数据。

1. 数据模型概述

车联网数据通常包括车辆的基本信息、传感器数据、位置信息等。我们可以将这些数据分为两类:

  • 静态数据:车辆的基本信息,如车辆ID、车型、生产日期等。
  • 动态数据:车辆运行时产生的数据,如速度、油耗、位置、温度等。

2. 表结构设计

在TDengine中,可以使用超级表(Super Table)和子表(Sub Table)来组织数据。超级表定义了数据的通用结构,而子表则存储具体设备的数据。

2.1 静态数据表

静态数据可以存储在一个单独的表中,或者作为超级表的一部分。如果静态数据变化不频繁,可以将其作为超级表的标签(Tag)。

CREATE TABLE vehicle_info (vehicle_id BINARY(32),  -- 车辆IDmodel BINARY(32),       -- 车型production_date TIMESTAMP,  -- 生产日期PRIMARY KEY(vehicle_id)
);
2.2 动态数据表

动态数据可以使用超级表和子表来存储。超级表定义了所有子表的公共结构,子表则存储具体车辆的数据。

-- 创建超级表
CREATE STABLE vehicle_data (ts TIMESTAMP,          -- 时间戳speed DOUBLE,          -- 速度fuel_level DOUBLE,     -- 油耗temperature DOUBLE,    -- 温度latitude DOUBLE,       -- 纬度longitude DOUBLE       -- 经度
) TAGS (vehicle_id BINARY(32),  -- 车辆IDmodel BINARY(32)        -- 车型
);-- 创建子表
CREATE TABLE vehicle_001 USING vehicle_data TAGS ('vehicle_001', 'ModelA');
CREATE TABLE vehicle_002 USING vehicle_data TAGS ('vehicle_002', 'ModelB');--也可以自动建表,见上面目录自动建表

3. 插入数据

插入数据时,指定子表名称和具体的时间戳及数据值。

INSERT INTO vehicle_001 (ts, speed, fuel_level, temperature, latitude, longitude) VALUES (NOW, 60, 50, 25, 37.7749, -122.4194);
INSERT INTO vehicle_002 (ts, speed, fuel_level, temperature, latitude, longitude) VALUES (NOW, 55, 45, 22, 37.7749, -122.4194);

4. 查询数据

查询数据时,可以利用超级表的标签进行过滤和聚合。

4.1 查询单个车辆的数据
SELECT * FROM vehicle_001 WHERE ts >= NOW - 1h;
4.2 查询多个车辆的数据
SELECT * FROM vehicle_data WHERE ts >= NOW - 1h AND vehicle_id IN ('vehicle_001', 'vehicle_002');
4.3 聚合查询
SELECT vehicle_id, AVG(speed), MAX(fuel_level) FROM vehicle_data WHERE ts >= NOW - 1h GROUP BY vehicle_id;

5. 性能优化

  • 分区:可以根据时间或车辆ID对数据进行分区,提高查询性能。
  • 索引:虽然TDengine不支持传统的关系型数据库索引,但通过合理的设计表结构和使用标签,可以实现高效的查询。
  • 数据压缩:TDengine支持多种数据压缩算法,可以有效减少存储空间。

6. 安全性和监控

  • 权限管理:配置合适的用户权限,确保数据的安全性。
  • 监控:定期监控数据库的性能指标,及时发现和解决问题。

相关文章:

tdengine学习笔记-建库和建表

目录 建库和建表 创建超级表​ 创建表​ 自动建表​ 创建普通表​ 多列模型 VS 单列模型​ 数据类型映射​ 示例程序汇总​ 在车联网领域的应用 1. 数据模型概述 2. 表结构设计 2.1 静态数据表 2.2 动态数据表 4. 查询数据 4.1 查询单个车辆的数据 4.2 查询多个…...

Django数据迁移出错,解决raise NodeNotFoundError问题

错误出现在: raise NodeNotFoundError(self.error_message, self.key, originself.origin) django.db.migrations.exceptions.NodeNotFoundError: Migration myApp.0003_alter_jobinfo_practise dependencies reference nonexistent parent node (myApp, 0002_renam…...

景联文科技:以全面数据处理服务推动AI创新与产业智能化转型

数据标注公司在人工智能领域扮演着重要角色,通过提供高质量的数据标注服务,帮助企业和组织训练和优化机器学习模型。从需求分析到数据交付,每一个步骤都需要严格把控,确保数据的质量和安全性。 景联文科技是一家专业的数据采集与标…...

MySQL学习/复习7表的内外连接

一、内连接...

Spring Cloud入门笔记2(OpenFeign)

场景&#xff1a; OpenFeign中集成了LoadBalancer,并简化了微服务调用&#xff0c;所以实际上使用该技术 技术栈&#xff1a;OpenFeign 步骤一&#xff1a;导入依赖 <!--openfeign--> <dependency><groupId>org.springframework.cloud</groupId><a…...

小程序中模拟发信息输入框,让textarea可以设置最大宽以及根据输入的内容自动变高的方式

<textarea show-confirm-bar"{{false}}" value"{{item.aValue}}" maxlength"301" placeholder"请输入" auto-height"{{true}}" bind:blur"onBlurTextarea" focus"{{true}}" bindinput"…...

学习HTML第二十九天

学习文章目录 二.单选框三.复选框 二.单选框 常用属性如下&#xff1a; name 属性&#xff1a;数据的名称&#xff0c;注意&#xff1a;想要单选效果&#xff0c;多个 radio 的 name 属性值要保持一致。 value 属性&#xff1a;提交的数据值。 checked 属性&#xff1a;让该单…...

汽车安全再进化 - SemiDrive X9HP 与环景影像系统 AVM 的系统整合

当今汽车工业正面临著前所未有的挑战与机遇&#xff0c;随著自动驾驶技术的迅速发展&#xff0c;汽车的安全性与性能需求日益提高。在这样的背景下&#xff0c;汽车 AVM&#xff08;Automotive Visual Monitoring&#xff09;标准应运而生&#xff0c;成为促进汽车智能化和安全…...

QString 转 char*问题与方法(const_cast的使用问题)

1、背景:今天有QString的变量&#xff0c;将QString的值传递给void func(char * ptr)&#xff0c;于是就有了类似下面这一段离谱的代码 当时我还在想为什么var的值为空了&#xff0c;为什么呢。 2、原因:就是因为右边函数返回的是一个临时指针对象&#xff0c;给到了右边&…...

flink cdc 应用

SQLServer 1. The db history topic or its content is fully or partially missing. Please check database history topic configuration and re-execute the snapshot. 遇到了一下问题&#xff0c;多次尝试&#xff0c;最终发现是数据库大小写要一致。 Caused by: io.deb…...

MyBlog(三) -- APP的应用

文章目录 前言一、APP是什么?二、创建APP三、使用APP1. 注册app2. 添加路由3. 运行过程4. 完善视图函数5. 结果展示 总结 前言 前面我们已经学习了如何创建一个新的项目,并且配置好了项目的启动文件,成功将项目启动! 那么接下来我们的主要任务就是需要完善这个项目中应该包含…...

docker有哪些网络模式

Docker 提供了多种网络模式&#xff08;Networking Modes&#xff09;&#xff0c;每种模式都有其特定的用例和优缺点。以下是 Docker 的几种主要网络模式&#xff1a; 1. Bridge 网络&#xff08;默认&#xff09; 描述&#xff1a;在这种模式下&#xff0c;Docker 创建了一…...

npoi 如何设置单元格为文本类型

ICellStyle style workbook.CreateCellStyle(); var font workbook.CreateFont(); font.FontHeightInPoints 10; //font.FontName "Arial"; font.FontName "仿宋"; style.Alignment NP…...

Vue3、Vite5、Primevue、Oxlint、Husky9 简单快速搭建最新的Web项目模板

Vue3、Vite5、Oxlint、Husky9 简单搭建最新的Web项目模板 特色进入正题创建基础模板配置API自动化导入配置组件自动化导入配置UnoCss接入Primevue接入VueRouter4配置项目全局环境变量 封装Axios接入Pinia状态管理接入Prerttier OXLint ESLint接入 husky lint-staged&#xf…...

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…...

海康IPC接入TRTC时,从海康中获取的数据显示时色差不正确

2021/1 记录海康IPC接入TRTC时的历史日志 从海康sdk接口获取数据&#xff0c;进行解码 org.MediaPlayer.PlayM4.Player.T_YV12;private void setDecodeCB() {Player.getInstance().setDecodeCB(m_iPort, (nPort, data, nDataLen, nWidth, nHeight, nFrameTime, nDataType,…...

『VUE』31. 生命周期的应用(详细图文注释)

目录 在合适的时间进行操作取dom元素利用生命周期模拟网络数据发送代码示例 总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 在合适的时间进行操作 假设网页一颗果树,我们要取dom(果实),一定要在渲染完成后才能取(果实) 通常…...

Mybatis框架之建造者模式 (Builder Pattern)

MyBatis 框架中大量使用了 建造者模式 (Builder Pattern) 来构建复杂的对象&#xff0c;尤其是在 SQL 语句的解析、配置对象的创建以及动态 SQL 的生成 等方面。建造者模式使得 MyBatis 能够更灵活、清晰地构建对象&#xff0c;尤其是那些需要多步创建和配置的复杂对象。 1. 什…...

Java从入门到精通笔记篇(十三)

与流处理 ambda表达式 定义 lambda表达式不能被独立执行&#xff0c;因此必须实现函数式接口&#xff0c;并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示 “->”符号是由英文状态下的“-”和“>”组成的&#xff0c;符号之间没有空格。 lambd…...

嵌入式:STM32的启动(Startup)文件解析

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 启动文件(Startup File)是嵌入式系统开发中的核心组件之一&#xff0c;它用于初始化系统并为主程序的运行做好准备。在大多数情况下&#xff0c;启动文件是用汇编语言编…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...