數據建模是時序數據庫應用開發(fā)的基礎環(huán)節(jié),合理的建模設計直接影響系統的性能和可維護性。本文將以智能電表為例,詳細介紹TDengine時序數據庫的數據建模實踐。
一、建模設計原則
1.1 核心設計理念
TDengine采用”一個數據采集點一張表”的設計理念,這一理念帶來以下優(yōu)勢:
- 寫入性能最優(yōu):單表單寫入者,無鎖寫入
- 查詢效率最高:數據連續(xù)存儲,減少隨機IO
- 壓縮率最高:列式存儲,變化緩慢的數據壓縮率高
1.2 建模步驟
- 分析業(yè)務場景,識別數據采集點
- 確定采集量和標簽
- 設計超級表結構
- 創(chuàng)建數據庫
- 創(chuàng)建超級表和子表
二、創(chuàng)建數據庫
2.1 數據庫創(chuàng)建語法
CREATE DATABASE power PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 16;
2.2 參數詳解
| 參數 | 說明 | 示例值 |
|---|---|---|
| PRECISION | 時間戳精度 | ‘ms’(毫秒) |
| KEEP | 數據保留天數 | 3650(約10年) |
| DURATION | 數據文件時間跨度 | 10(天) |
| BUFFER | 寫入內存池大小 | 16(MB) |
2.3 參數選擇建議
時間精度選擇:
- 毫秒(ms):適用于大多數物聯網場景
- 微秒(us):適用于金融、高頻交易場景
- 納秒(ns):適用于科學實驗、精密測量
數據保留策略:
- 根據業(yè)務需求和存儲容量確定
- 歷史數據可定期歸檔
- 冷熱數據分層存儲
2.4 切換數據庫
USE power;
執(zhí)行后,后續(xù)的插入、查詢等操作都在當前的power數據庫中進行。
三、創(chuàng)建超級表
3.1 超級表創(chuàng)建語法
CREATE STABLE meters (
ts timestamp,
current float,
voltage int,
phase float
) TAGS (
location varchar(64),
group_id int
);
3.2 列定義規(guī)則
時間戳列:
- 第1列必須為時間戳列
- 格式:
列名 timestamp
采集量列:
- 從第2列開始定義
- 數據類型可以是整型、浮點型、字符串等
- 示例:
current float、voltage int
標簽列:
- 通過TAGS關鍵字定義
- 數據類型可以是任意類型
- 標簽名不能與采集量列名相同
3.3 數據類型選擇
| 數據類型 | 適用場景 | 示例 |
|---|---|---|
| TINYINT | 小范圍整數 | 狀態(tài)碼 |
| SMALLINT | 中等范圍整數 | 溫度(整數) |
| INT | 常規(guī)整數 | 電壓值 |
| BIGINT | 大整數 | 設備ID |
| FLOAT | 單精度浮點 | 電流值 |
| DOUBLE | 雙精度浮點 | 精確測量值 |
| VARCHAR | 字符串 | 位置信息 |
| TIMESTAMP | 時間戳 | 采集時間 |
四、創(chuàng)建子表
4.1 手動創(chuàng)建子表
CREATE TABLE d1001
USING meters (
location,
group_id
) TAGS (
"California.SanFrancisco",
2
);
參數說明:
d1001:子表名稱USING meters:使用超級表meters作為模板TAGS后指定標簽值
4.2 自動建表
在寫入數據時自動創(chuàng)建子表:
INSERT INTO d1002
USING meters
TAGS (
"California.SanFrancisco",
2
) VALUES (
NOW,
10.2,
219,
0.32
);
當子表d1002不存在時,系統會先自動創(chuàng)建子表,再寫入數據。
4.3 部分標簽指定
可以只指定部分標簽值,未指定的標簽值為NULL:
INSERT INTO d1005
USING meters (location)
TAGS ("beijing.chaoyang")
VALUES ("2018-10-04 14:38:07", 10.15, 217, 0.33);
五、創(chuàng)建普通表
5.1 普通表概念
普通表是不帶任何標簽的表,與普通關系型數據庫中的表相似。
5.2 普通表與子表的區(qū)別
| 特性 | 普通表 | 子表 |
|---|---|---|
| 標簽擴展性 | 無標簽 | 具有可變標簽 |
| 表歸屬 | 獨立存在 | 隸屬于超級表 |
| 轉換限制 | 不能相互轉換 | 不能相互轉換 |
5.3 使用場景
普通表適用于:
- 不需要標簽分類的數據
- 單一數據源的場景
- 與傳統關系型數據庫兼容的需求
六、建模最佳實踐
6.1 數據庫規(guī)劃
按數據特征分庫:
- 不同采集頻率的數據分庫
- 不同保留策略的數據分庫
- 不同業(yè)務域的數據分庫
示例:
-- 高頻采集數據庫
CREATE DATABASE high_freq PRECISION 'ms' KEEP 365 DURATION 1;
-- 低頻采集數據庫
CREATE DATABASE low_freq PRECISION 'ms' KEEP 3650 DURATION 30;
6.2 超級表設計
同類型設備歸為一張超級表:
- 相同采集量結構
- 相同的標簽維度
- 便于統一查詢和管理
標簽設計原則:
- 選擇穩(wěn)定不變的屬性作為標簽
- 常用于篩選條件的屬性優(yōu)先
- 標簽數量不宜過多(建議不超過10個)
6.3 子表命名規(guī)范
推薦命名方式:
- 使用設備ID作為子表名
- 保持命名規(guī)則的一致性
- 避免使用特殊字符
示例:
d1001, d1002, d1003... -- 設備ID
meter_sf_001 -- 地區(qū)+序號
sensor_temp_001 -- 傳感器類型+序號
6.4 采集量設計
列數控制:
- 單表列數不宜過多(建議不超過50列)
- 相關采集量放在一起
- 不常用的采集量可單獨建表
數據類型選擇:
- 選擇合適的數據類型,避免浪費存儲
- 浮點數注意精度要求
- 字符串類型指定合理長度
七、完整建模示例
7.1 場景描述
某智能電表系統,需要存儲以下數據:
- 設備數量:10000臺
- 采集頻率:每10秒一次
- 采集量:電流、電壓、相位
- 標簽:位置、分組ID
7.2 建模實現
-- 1. 創(chuàng)建數據庫
CREATE DATABASE power
PRECISION 'ms'
KEEP 365
DURATION 10
BUFFER 96;
-- 2. 切換數據庫
USE power;
-- 3. 創(chuàng)建超級表
CREATE STABLE meters (
ts timestamp,
current float,
voltage int,
phase float
) TAGS (
location varchar(64),
group_id int
);
-- 4. 寫入數據(自動創(chuàng)建子表)
INSERT INTO d1001 USING meters TAGS ("California.SanFrancisco", 2)
VALUES (NOW, 10.3, 219, 0.31);
7.3 查詢驗證
-- 查詢所有設備
SELECT COUNT(*) FROM meters;
-- 按地區(qū)分組統計
SELECT location, COUNT(*), AVG(voltage)
FROM meters
GROUP BY location;
-- 時間窗口聚合
SELECT tbname, _wstart, avg(voltage)
FROM meters
WHERE ts >= NOW - 1h
PARTITION BY tbname
INTERVAL(1m);
八、建模常見問題
8.1 表數量過多
問題:設備數量巨大,擔心表數量過多
解決方案:TDengine專門優(yōu)化了海量表管理,千萬級表數量不影響性能
8.2 標簽修改需求
問題:設備標簽可能需要修改
解決方案:TDengine支持標簽的修改、添加、刪除操作
8.3 歷史數據遷移
問題:如何遷移歷史數據
解決方案:
- 使用批量INSERT語句導入
- 通過第三方工具(如DataX)遷移
- 利用TDengine的導入功能
九、性能優(yōu)化建議
9.1 寫入優(yōu)化
- 使用批量寫入代替單條寫入
- 利用自動建表機制
- 合理設置BUFFER參數
9.2 查詢優(yōu)化
- 查詢時指定時間范圍
- 使用PARTITION BY并行查詢
- 合理使用SLIMIT控制結果
9.3 存儲優(yōu)化
- 選擇合適的KEEP參數
- 定期清理過期數據
- 監(jiān)控壓縮率
十、監(jiān)控與維護
10.1 查看壓縮率
SELECT * FROM INFORMATION_SCHEMA.INS_DISK_USAGE
WHERE db_name = 'power';
10.2 查看表分布
SHOW TABLE DISTRIBUTED meters;
10.3 數據庫狀態(tài)
SHOW DATABASES;
SHOW STABLES;
SHOW TABLES;
總結
數據建模是時序數據庫應用開發(fā)的基礎,合理的建模設計能夠充分發(fā)揮TDengine的性能優(yōu)勢。通過”一個數據采集點一張表”的設計理念,配合超級表模板機制,開發(fā)者可以高效管理海量設備數據。本文介紹的建模實踐,包括數據庫創(chuàng)建、超級表設計、子表管理等,為構建工業(yè)數據管理平臺(IDMP)和實時數據庫應用提供了完整的指導。TDengine憑借其專業(yè)的時序數據建模能力,成為物聯網和工業(yè)場景的理想選擇。



互聯網.png)



-1.png)












伙伴.png)



