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



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



