TDengine 數據建模
TDengine 采(cai)用關系型數(shu)據模型,需要(yao)建庫、建表。因此對于(yu)一(yi)個具(ju)體的(de)(de)應用場景,需要(yao)考慮庫、超級表和普(pu)通表的(de)(de)設計(ji)。本節不討論細致的(de)(de)語法規則,只介(jie)紹概念(nian)。
關于數據建模請參考視頻教程。
創建庫
不(bu)(bu)同(tong)(tong)(tong)類型的(de)數(shu)(shu)(shu)(shu)據(ju)(ju)采(cai)(cai)集(ji)點往(wang)往(wang)具有(you)不(bu)(bu)同(tong)(tong)(tong)的(de)數(shu)(shu)(shu)(shu)據(ju)(ju)特(te)征(zheng),包括數(shu)(shu)(shu)(shu)據(ju)(ju)采(cai)(cai)集(ji)頻率的(de)高低,數(shu)(shu)(shu)(shu)據(ju)(ju)保留時(shi)間(jian)的(de)長(chang)短,副(fu)本的(de)數(shu)(shu)(shu)(shu)目,數(shu)(shu)(shu)(shu)據(ju)(ju)塊(kuai)的(de)大小(xiao),是否允許更(geng)新數(shu)(shu)(shu)(shu)據(ju)(ju)等(deng)等(deng)。為(wei)了(le)在各種場(chang)景(jing)下 TDengine 都能最(zui)大效率的(de)工作,TDengine 建議將不(bu)(bu)同(tong)(tong)(tong)數(shu)(shu)(shu)(shu)據(ju)(ju)特(te)征(zheng)的(de)表創建在不(bu)(bu)同(tong)(tong)(tong)的(de)庫里(li)(li),因為(wei)每個庫可以(yi)配置不(bu)(bu)同(tong)(tong)(tong)的(de)存儲策略(lve)。創建一個庫時(shi),除SQL標準的(de)選(xuan)項外,應(ying)用還可以(yi)指定保留時(shi)長(chang)、副(fu)本數(shu)(shu)(shu)(shu)、內存塊(kuai)個數(shu)(shu)(shu)(shu)、時(shi)間(jian)精度(du)、文(wen)件塊(kuai)里(li)(li)最(zui)大最(zui)小(xiao)記錄條數(shu)(shu)(shu)(shu)、是否壓縮、一個數(shu)(shu)(shu)(shu)據(ju)(ju)文(wen)件覆蓋的(de)天數(shu)(shu)(shu)(shu)等(deng)多種參數(shu)(shu)(shu)(shu)。比如:
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1;
上述語句將創建一個名為 power 的庫,這個庫的數據將保留 365 天(超過 365 天將被自動刪除),每 10 天一個數據文件,內存塊數為 6,允許更新數據。詳細的語法及參數請見 TAOS SQL 的數據管理 章節。
創(chuang)建庫之后,需要使用 SQL 命令 USE 將當前(qian)庫切(qie)換過來(lai),例如:
USE power;
將當前連(lian)接(jie)里(li)操作的(de)庫(ku)(ku)換為 power,否(fou)則對具體表(biao)操作前,需要使(shi)用(yong)“庫(ku)(ku)名(ming)(ming).表(biao)名(ming)(ming)”來指定庫(ku)(ku)的(de)名(ming)(ming)字。
注意:
- 任何一張表或超級表是屬于一個庫的,在創建表之前,必須先創建庫。
- 處于兩個不同庫的表是不能進行 JOIN 操作的。
- 創建并插入記錄、查詢歷史記錄的時候,均需要指定時間戳。
創建超級表
一個物聯網系統,往往存在多種類型的設備,比如對于電網,存在智能電表、變壓器、母線、開關等等。為便于多表之間的聚合,使用 TDengine, 需要對每個類型的數據采集點創建一個超級表。以表1 中的(de)智(zhi)能電表為例(li),可以(yi)使用如下的(de) SQL 命令創建超級表:
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);
注意:這一(yi)指(zhi)令中的(de) STABLE 關鍵字,在 2.0.15 之前的(de)版本中需寫作 TABLE 。
與創建普通表一樣,創建表時,需要提供表名(示例中為 meters),表結構 Schema,即數據列的定義。第一列必須為時間戳(示例中為 ts),其他列為采集的物理量(示例中為 current, voltage, phase),數據類型可以為整型、浮點型、字符串等。除此之外,還需要提供標簽的 schema (示例中為 location, groupId),標簽的數據類型可以為整型、浮點型、字符串等。采集點的靜態屬性往往可以作為標簽,比如采集點的地理位置、設備型號、設備組 ID、管理員 ID 等等。標簽的 schema 可以事后增加、刪除、修改。具體定義以及細節請見 TAOS SQL 的超級表管理 章節。
每一(yi)(yi)種類(lei)型的(de)數據(ju)(ju)采(cai)(cai)集(ji)點需(xu)(xu)要建立一(yi)(yi)個(ge)超級(ji)(ji)表(biao),因此一(yi)(yi)個(ge)物(wu)(wu)聯網系(xi)統,往往會(hui)有(you)多(duo)個(ge)超級(ji)(ji)表(biao)。對(dui)于(yu)電網,我(wo)們就需(xu)(xu)要對(dui)智能(neng)電表(biao)、變(bian)壓器、母線(xian)、開(kai)關等(deng)(deng)都建立一(yi)(yi)個(ge)超級(ji)(ji)表(biao)。在物(wu)(wu)聯網中,一(yi)(yi)個(ge)設備就可(ke)能(neng)有(you)多(duo)個(ge)數據(ju)(ju)采(cai)(cai)集(ji)點(比(bi)如(ru)一(yi)(yi)臺風(feng)力發(fa)電的(de)風(feng)機,有(you)的(de)采(cai)(cai)集(ji)點采(cai)(cai)集(ji)電流、電壓等(deng)(deng)電參數,有(you)的(de)采(cai)(cai)集(ji)點采(cai)(cai)集(ji)溫度(du)、濕度(du)、風(feng)向(xiang)等(deng)(deng)環境參數),這(zhe)個(ge)時候,對(dui)這(zhe)一(yi)(yi)類(lei)型的(de)設備,需(xu)(xu)要建立多(duo)張超級(ji)(ji)表(biao)。一(yi)(yi)張超級(ji)(ji)表(biao)里包含的(de)采(cai)(cai)集(ji)物(wu)(wu)理(li)量必須是(shi)同時采(cai)(cai)集(ji)的(de)(時間(jian)戳是(shi)一(yi)(yi)致的(de))。
一張超(chao)級表(biao)最多(duo)(duo)容許 1024 列(lie),如果(guo)一個(ge)采集(ji)點采集(ji)的物(wu)理(li)量(liang)個(ge)數超(chao)過 1024,需(xu)要(yao)建多(duo)(duo)張超(chao)級表(biao)來(lai)處(chu)理(li)。一個(ge)系統可以(yi)有多(duo)(duo)個(ge) DB,一個(ge) DB 里(li)可以(yi)有一到多(duo)(duo)個(ge)超(chao)級表(biao)。(從 2.1.7.0 版本開始,列(lie)數限制(zhi)由 1024 列(lie)放寬到了(le) 4096 列(lie)。)
創建表
TDengine 對每個數據采集點需要獨立建表。與標準的關系型數據庫一樣,一張表有表名,Schema,但除此之外,還可以帶有一到多個標簽。創建時,需要使用超級表做模板,同時指定標簽的具體值。以表1中(zhong)的智能電表為(wei)例,可以使(shi)用如下(xia)的SQL命令(ling)建表:
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
其中 d1001 是表名,meters 是超級表的表名,后面緊跟標簽 Location 的具體標簽值 ”Beijing.Chaoyang",標簽 groupId 的具體標簽值 2。雖然在創建表時,需要指定標簽值,但可以事后修改。詳細細則請見 TAOS SQL 的表管理 章節。
注意:目前 TDengine 沒有(you)從技術(shu)層面限制使用一(yi)個(ge) database (dbA)的超級表(biao)作為模板建立另一(yi)個(ge) database (dbB)的子表(biao),后續(xu)會禁止(zhi)這種用法,不建議使用這種方法建表(biao)。
TDengine 建議(yi)將數據采集點(dian)的全局唯(wei)一(yi)(yi) ID 作(zuo)為(wei)表名(比如設備序(xu)列號)。但對于有的場景,并沒有唯(wei)一(yi)(yi)的 ID,可以將多個(ge) ID 組合成一(yi)(yi)個(ge)唯(wei)一(yi)(yi)的 ID。不建議(yi)將具有唯(wei)一(yi)(yi)性的 ID 作(zuo)為(wei)標(biao)簽(qian)值(zhi)。
自動建表:在某些特殊場景(jing)中,用(yong)戶在寫數據時(shi)并不確(que)定某個數據采集點的(de)表是否存在,此時(shi)可在寫入(ru)數據時(shi)使用(yong)自(zi)動建表語法來創建不存在的(de)表,若該(gai)表已存在則不會建立(li)新表。比(bi)如:
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 還未創建,則使用超級表 meters 做模板自動創建,同時打上標簽值 “Beijing.Chaoyang", 2。
關于自動建表的詳細語法請參見 插入記錄時自動建表 章節。
多列模型 vs 單列模型
TDengine 支(zhi)持多列(lie)模(mo)型,只要(yao)物(wu)理量(liang)是一個數據采(cai)(cai)集點同(tong)時采(cai)(cai)集的(de)(de)(時間戳(chuo)一致),這些量(liang)就(jiu)可以作為不同(tong)列(lie)放在(zai)一張超(chao)級表里。但還(huan)有一種極限的(de)(de)設計,單(dan)列(lie)模(mo)型,每個采(cai)(cai)集的(de)(de)物(wu)理量(liang)都單(dan)獨(du)建(jian)(jian)表,因(yin)此每種類型的(de)(de)物(wu)理量(liang)都單(dan)獨(du)建(jian)(jian)立一超(chao)級表。比(bi)如電(dian)流、電(dian)壓、相位,就(jiu)建(jian)(jian)三(san)張超(chao)級表。
TDengine 建議盡(jin)可(ke)能采(cai)(cai)(cai)用(yong)(yong)(yong)多列模型(xing),因(yin)為插入效(xiao)率以及存儲(chu)效(xiao)率更高。但(dan)對于有些場景,一個采(cai)(cai)(cai)集(ji)點的(de)采(cai)(cai)(cai)集(ji)量的(de)種類(lei)經常變(bian)化,這(zhe)(zhe)個時(shi)候,如果采(cai)(cai)(cai)用(yong)(yong)(yong)多列模型(xing),就(jiu)需要頻繁(fan)修改超(chao)級表的(de)結構定義,讓應用(yong)(yong)(yong)變(bian)的(de)復雜,這(zhe)(zhe)個時(shi)候,采(cai)(cai)(cai)用(yong)(yong)(yong)單(dan)列模型(xing)會顯得更簡(jian)單(dan)。

