TDengine 數(shù)據(jù)建模
TDengine 采用關(guān)系型數(shù)據(jù)模型,需要建庫、建表。因此對(duì)于一個(gè)具體的應(yīng)用場(chǎng)景,需要考慮庫、超級(jí)表和普通表的設(shè)計(jì)。本節(jié)不討論細(xì)致的語法規(guī)則,只介紹概念。
關(guān)于數(shù)據(jù)建模請(qǐng)參考視頻教程。
創(chuàng)建庫
不同類型的數(shù)據(jù)采集點(diǎn)往往具有不同的數(shù)據(jù)特征,包括數(shù)據(jù)采集頻率的高低,數(shù)據(jù)保留時(shí)間的長短,副本的數(shù)目,數(shù)據(jù)塊的大小,是否允許更新數(shù)據(jù)等等。為了在各種場(chǎng)景下 TDengine 都能最大效率的工作,TDengine 建議將不同數(shù)據(jù)特征的表創(chuàng)建在不同的庫里,因?yàn)槊總€(gè)庫可以配置不同的存儲(chǔ)策略。創(chuàng)建一個(gè)庫時(shí),除SQL標(biāo)準(zhǔn)的選項(xiàng)外,應(yīng)用還可以指定保留時(shí)長、副本數(shù)、內(nèi)存塊個(gè)數(shù)、時(shí)間精度、文件塊里最大最小記錄條數(shù)、是否壓縮、一個(gè)數(shù)據(jù)文件覆蓋的天數(shù)等多種參數(shù)。比如:
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1;
上述語句將創(chuàng)建一個(gè)名為 power 的庫,這個(gè)庫的數(shù)據(jù)將保留 365 天(超過 365 天將被自動(dòng)刪除),每 10 天一個(gè)數(shù)據(jù)文件,內(nèi)存塊數(shù)為 6,允許更新數(shù)據(jù)。詳細(xì)的語法及參數(shù)請(qǐng)見 TAOS SQL 的數(shù)據(jù)管理 章節(jié)。
創(chuàng)建庫之后,需要使用 SQL 命令 USE 將當(dāng)前庫切換過來,例如:
USE power;
將當(dāng)前連接里操作的庫換為 power,否則對(duì)具體表操作前,需要使用“庫名.表名”來指定庫的名字。
注意:
- 任何一張表或超級(jí)表是屬于一個(gè)庫的,在創(chuàng)建表之前,必須先創(chuàng)建庫。
- 處于兩個(gè)不同庫的表是不能進(jìn)行 JOIN 操作的。
- 創(chuàng)建并插入記錄、查詢歷史記錄的時(shí)候,均需要指定時(shí)間戳。
創(chuàng)建超級(jí)表
一個(gè)物聯(lián)網(wǎng)系統(tǒng),往往存在多種類型的設(shè)備,比如對(duì)于電網(wǎng),存在智能電表、變壓器、母線、開關(guān)等等。為便于多表之間的聚合,使用 TDengine, 需要對(duì)每個(gè)類型的數(shù)據(jù)采集點(diǎn)創(chuàng)建一個(gè)超級(jí)表。以表1 中的智能電表為例,可以使用如下的 SQL 命令創(chuàng)建超級(jí)表:
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);
注意:這一指令中的 STABLE 關(guān)鍵字,在 2.0.15 之前的版本中需寫作 TABLE 。
與創(chuàng)建普通表一樣,創(chuàng)建表時(shí),需要提供表名(示例中為 meters),表結(jié)構(gòu) Schema,即數(shù)據(jù)列的定義。第一列必須為時(shí)間戳(示例中為 ts),其他列為采集的物理量(示例中為 current, voltage, phase),數(shù)據(jù)類型可以為整型、浮點(diǎn)型、字符串等。除此之外,還需要提供標(biāo)簽的 schema (示例中為 location, groupId),標(biāo)簽的數(shù)據(jù)類型可以為整型、浮點(diǎn)型、字符串等。采集點(diǎn)的靜態(tài)屬性往往可以作為標(biāo)簽,比如采集點(diǎn)的地理位置、設(shè)備型號(hào)、設(shè)備組 ID、管理員 ID 等等。標(biāo)簽的 schema 可以事后增加、刪除、修改。具體定義以及細(xì)節(jié)請(qǐng)見 TAOS SQL 的超級(jí)表管理 章節(jié)。
每一種類型的數(shù)據(jù)采集點(diǎn)需要建立一個(gè)超級(jí)表,因此一個(gè)物聯(lián)網(wǎng)系統(tǒng),往往會(huì)有多個(gè)超級(jí)表。對(duì)于電網(wǎng),我們就需要對(duì)智能電表、變壓器、母線、開關(guān)等都建立一個(gè)超級(jí)表。在物聯(lián)網(wǎng)中,一個(gè)設(shè)備就可能有多個(gè)數(shù)據(jù)采集點(diǎn)(比如一臺(tái)風(fēng)力發(fā)電的風(fēng)機(jī),有的采集點(diǎn)采集電流、電壓等電參數(shù),有的采集點(diǎn)采集溫度、濕度、風(fēng)向等環(huán)境參數(shù)),這個(gè)時(shí)候,對(duì)這一類型的設(shè)備,需要建立多張超級(jí)表。一張超級(jí)表里包含的采集物理量必須是同時(shí)采集的(時(shí)間戳是一致的)。
一張超級(jí)表最多容許 1024 列,如果一個(gè)采集點(diǎn)采集的物理量個(gè)數(shù)超過 1024,需要建多張超級(jí)表來處理。一個(gè)系統(tǒng)可以有多個(gè) DB,一個(gè) DB 里可以有一到多個(gè)超級(jí)表。(從 2.1.7.0 版本開始,列數(shù)限制由 1024 列放寬到了 4096 列。)
創(chuàng)建表
TDengine 對(duì)每個(gè)數(shù)據(jù)采集點(diǎn)需要獨(dú)立建表。與標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫一樣,一張表有表名,Schema,但除此之外,還可以帶有一到多個(gè)標(biāo)簽。創(chuàng)建時(shí),需要使用超級(jí)表做模板,同時(shí)指定標(biāo)簽的具體值。以表1中的智能電表為例,可以使用如下的SQL命令建表:
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
其中 d1001 是表名,meters 是超級(jí)表的表名,后面緊跟標(biāo)簽 Location 的具體標(biāo)簽值 ”Beijing.Chaoyang",標(biāo)簽 groupId 的具體標(biāo)簽值 2。雖然在創(chuàng)建表時(shí),需要指定標(biāo)簽值,但可以事后修改。詳細(xì)細(xì)則請(qǐng)見 TAOS SQL 的表管理 章節(jié)。
注意:目前 TDengine 沒有從技術(shù)層面限制使用一個(gè) database (dbA)的超級(jí)表作為模板建立另一個(gè) database (dbB)的子表,后續(xù)會(huì)禁止這種用法,不建議使用這種方法建表。
TDengine 建議將數(shù)據(jù)采集點(diǎn)的全局唯一 ID 作為表名(比如設(shè)備序列號(hào))。但對(duì)于有的場(chǎng)景,并沒有唯一的 ID,可以將多個(gè) ID 組合成一個(gè)唯一的 ID。不建議將具有唯一性的 ID 作為標(biāo)簽值。
自動(dòng)建表:在某些特殊場(chǎng)景中,用戶在寫數(shù)據(jù)時(shí)并不確定某個(gè)數(shù)據(jù)采集點(diǎn)的表是否存在,此時(shí)可在寫入數(shù)據(jù)時(shí)使用自動(dòng)建表語法來創(chuàng)建不存在的表,若該表已存在則不會(huì)建立新表。比如:
INSERT INTO d1001 USING meters TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
上述 SQL 語句將記錄(now, 10.2, 219, 0.32)插入表 d1001。如果表 d1001 還未創(chuàng)建,則使用超級(jí)表 meters 做模板自動(dòng)創(chuàng)建,同時(shí)打上標(biāo)簽值 “Beijing.Chaoyang", 2。
關(guān)于自動(dòng)建表的詳細(xì)語法請(qǐng)參見 插入記錄時(shí)自動(dòng)建表 章節(jié)。
多列模型 vs 單列模型
TDengine 支持多列模型,只要物理量是一個(gè)數(shù)據(jù)采集點(diǎn)同時(shí)采集的(時(shí)間戳一致),這些量就可以作為不同列放在一張超級(jí)表里。但還有一種極限的設(shè)計(jì),單列模型,每個(gè)采集的物理量都單獨(dú)建表,因此每種類型的物理量都單獨(dú)建立一超級(jí)表。比如電流、電壓、相位,就建三張超級(jí)表。
TDengine 建議盡可能采用多列模型,因?yàn)椴迦胄室约按鎯?chǔ)效率更高。但對(duì)于有些場(chǎng)景,一個(gè)采集點(diǎn)的采集量的種類經(jīng)常變化,這個(gè)時(shí)候,如果采用多列模型,就需要頻繁修改超級(jí)表的結(jié)構(gòu)定義,讓應(yīng)用變的復(fù)雜,這個(gè)時(shí)候,采用單列模型會(huì)顯得更簡單。

