建模方案設計
建模方案設計
本章節主要介紹如何將時序數據應用場景轉化為IoTDB時序建模。
1. 時序數據模型
在構建IoTDB建模方案前,需要先了解時序數據和時序數據模型,詳細內容見此頁面:時序數據模型
2. IoTDB 的樹表孿生模型
IoTDB 提供了樹表孿生模型的方式,其特點分別如下:
樹模型:以測點為對象進行管理,每個測點對應一條時間序列,測點名按.分割可形成一個樹形目錄結構,與物理世界一一對應,對測點的讀寫操作簡單直觀。
- 數據建模時,為了足夠的性能要求,建議數據路徑(Path)的倒數第二層節點(對應設備數量)不少于 1000 個,且設備數量與并發處理能力掛鉤,設備數量充足時,并發讀寫效率更優。
若遇到“設備數量較少但單設備測點數量較多”的場景(如僅 3 臺設備,每臺設備含 10000 個測點),推薦在最后層級新增.value,以此提升倒數第二層節點總數,示例:root.db.device01.metric.value。- 在構建樹模型路徑時,節點命名若存在包含非標準字符或特殊符號的可能性,則建議對所有層級節點實施反引號封裝策略。這樣可以有效規避因字符解析異常導致的測點注冊失敗及數據寫入中斷問題,確保路徑標識符在語法解析層面的準確性。
表模型:推薦為每類設備創建一張表,同類設備的物理量采集都具備一定共性(如都采集溫度和濕度物理量),數據分析靈活豐富。
2.1 模型特點
樹表孿生模型有各自的適用場景。
以下表格從適用場景、典型操作等多個維度對樹模型和表模型進行了對比。用戶可以根據具體的使用需求,選擇適合的模型,從而實現數據的高效存儲和管理。
| 對比維度 | 樹模型 | 表模型 |
| 適用場景 | 測點管理,監控場景 | 設備管理,分析場景 |
| 典型操作 | 指定點位路徑進行讀寫 | 通過標簽進行數據篩選分析 |
| 結構特點 | 和文件系統一樣靈活增刪 | 模板化管理,便于數據治理 |
| 語法特點 | 簡潔靈活 | 分析豐富 |
| 性能對比 | 相同 | |
注意:
- 同一個集群實例中可以存在兩種模型空間,不同模型的語法、數據庫命名方式不同,默認不互相可見。
2.2 模型選擇
IoTDB 支持通過多種客戶端工具與數據庫建立連接,不同客戶端下進行模型選擇的方式說明如下:
通過 CLI 建立連接時,需要通過 sql_dialect 參數指定使用的模型(默認使用樹模型)。
# 樹模型
start-cli.sh(bat)
start-cli.sh(bat) -sql_dialect tree
# 表模型
start-cli.sh(bat) -sql_dialect table在使用 SQL 語言進行數據操作時,可通過 set 語句切換使用的模型。
-- 指定為樹模型
IoTDB> SET SQL_DIALECT=TREE
-- 指定為表模型
IoTDB> SET SQL_DIALECT=TABLE- 應用編程接口
通過多語言應用編程接口建立連接時,可通過模型對應的 session/sessionpool 創建連接池實例,簡單示例如下:
// 樹模型
SessionPool sessionPool =
new SessionPool.Builder()
.nodeUrls(nodeUrls)
.user(username)
.password(password)
.maxSize(3)
.build();
//表模型
ITableSessionPool tableSessionPool =
new TableSessionPoolBuilder()
.nodeUrls(nodeUrls)
.user(username)
.password(password)
.maxSize(1)
.build();# 樹模型
session = Session(
? ip=ip,
? port=port,
? user=username,
? password=password,
? fetch_size=1024,
? zone_id="UTC+8",
? enable_redirection=True
)
# 表模型
config = TableSessionPoolConfig(
? node_urls=node_urls,
? username=username,
? password=password,
? database=database,
? max_pool_size=max_pool_size,
? fetch_size=fetch_size,
? wait_timeout_in_ms=wait_timeout_in_ms,
)
session_pool = TableSessionPool(config)// 樹模型
session = new Session(hostip, port, username, password);
// 表模型
session = (new TableSessionBuilder())
->host(ip)
->rpcPort(port)
->username(username)
->password(password)
->build();//樹模型
config := &client.PoolConfig{
Host: host,
Port: port,
UserName: user,
Password: password,
}
sessionPool = client.NewSessionPool(config, 3, 60000, 60000, false)
defer sessionPool.Close()
//表模型
config := &client.PoolConfig{
Host: host,
Port: port,
UserName: user,
Password: password,
Database: dbname,
}
sessionPool := client.NewTableSessionPool(config, 3, 60000, 4000, false)
defer sessionPool.Close()//樹模型
var session_pool = new SessionPool(host, port, pool_size);
//表模型
var tableSessionPool = new TableSessionPool.Builder()
.SetNodeUrls(nodeUrls)
.SetUsername(username)
.SetPassword(password)
.SetFetchSize(1024)
.Build();使用表模型,必須在 url 中指定 sql_dialect 參數為 table。
// 樹模型
Class.forName("org.apache.iotdb.jdbc.IoTDBDriver");
Connection connection = DriverManager.getConnection(
"jdbc:iotdb://127.0.0.1:6667/", username, password);
// 表模型
Class.forName("org.apache.iotdb.jdbc.IoTDBDriver");
Connection connection = DriverManager.getConnection(
"jdbc:iotdb://127.0.0.1:6667?sql_dialect=table", username, password);2.3 樹轉表
IoTDB 提供了樹轉表功能,如下圖所示:

該功能支持通過創建表視圖的方式,將已存在的樹模型數據轉化為表視圖,進而通過表視圖進行查詢,實現了對同一份數據的樹模型和表模型協同處理。更詳細的功能介紹可參考樹轉表視圖,需要注意的是:?創建樹轉表視圖的 SQL 語句只允許在表模型下執行?。
3. 應用場景
應用場景主要包括三類:
場景一:使用樹模型進行數據的讀寫
場景二:使用表模型進行數據的讀寫
場景三:共用一份數據,使用樹模型進行數據讀寫、使用表模型進行數據分析
3.1 場景一:樹模型
3.1.1 特點
簡單直觀,和物理世界的監測點位一一對應
類似文件系統一樣靈活,可以設計任意分支結構
適用 DCS、SCADA 等工業監控場景
3.1.2 基礎概念
| 概念 | 定義 |
|---|---|
| 數據庫 | 定義:一個以 root. 為前綴的路徑 命名推薦:僅包含 root 的下一級節點,如 root.db 數量推薦:上限和內存相關,一個數據庫也可以充分利用機器資源,無需為性能原因創建多個數據庫 創建方式:推薦手動創建,也可創建時間序列時自動創建(默認為 root 的下一級節點) |
| 時間序列(測點) | 定義: 1. 一個以數據庫路徑為前綴的、由 . 分割的路徑,可包含任意多個層級,如 root.db.turbine.device1.metric1 2. 每個時間序列可以有不同的數據類型。 命名推薦: 1. 僅將唯一定位時間序列的標簽(類似聯合主鍵)放入路徑中,一般不超過10層 2. 通常將基數(不同的取值數量)少的標簽放在前面,便于系統將公共前綴進行壓縮 數量推薦: 1. 集群可管理的時間序列總量和總內存相關,可參考資源推薦章節 2. 任一層級的子節點數量沒有限制 創建方式:可手動創建或在數據寫入時自動創建。 |
| 設備 | 定義:倒數第二級為設備,如 root.db.turbine.device1.metric1中的“device1”這一層級即為設備 創建方式:無法僅創建設備,隨時間序列創建而存在 |
3.1.3 建模示例
3.1.3.1 有多種類型的設備需要管理,如何建模?
- 如場景中不同類型的設備具備不同的層級路徑和測點集合,可以在數據庫節點下按設備類型創建分支。每種設備下可以有不同的測點結構。

3.1.3.2 如果場景中沒有設備,只有測點,如何建模?
- 如場站的監控系統中,每個測點都有唯一編號,但無法對應到某些設備。

3.1.3.3 如果在一個設備下,既有子設備,也有測點,如何建模?
- 如在儲能場景中,每一層結構都要監控其電壓和電流,可以采用如下建模方式。

3.2 場景二:表模型
3.2.1 特點
以時序表建模管理設備時序數據,便于使用標準 SQL 進行分析
適用于設備數據分析或從其他數據庫遷移至 IoTDB 的場景
3.2.2 基礎概念
數據庫:可管理多類設備
時序表:對應一類設備
| 列類別 | 定義 |
|---|---|
| 時間列(TIME) | 每個時序表必須有一個時間列,且列名必須為 time,數據類型為 TIMESTAMP |
| 標簽列(TAG) | 設備的唯一標識(聯合主鍵),可以為 0 至多個 標簽信息不可修改和刪除,但允許增加 推薦按粒度由大到小進行排列 |
| 測點列(FIELD) | 一個設備采集的測點可以有1個至多個,值隨時間變化 表的測點列沒有數量限制,可以達到數十萬以上 |
| 屬性列(ATTRIBUTE) | 對設備的補充描述,不隨時間變化 設備屬性信息可以有0個或多個,可以更新或新增 少量希望修改的靜態屬性可以存至此列 |
數據篩選效率:時間列=標簽列>屬性列>測點列
3.2.3 建模示例
3.2.3.1 有多種類型的設備需要管理,如何建模?
- 推薦為每一類型的設備建立一張表,每個表可以具有不同的標簽和測點集合。
- 即使設備之間有聯系,或有層級關系,也推薦為每一類設備建一張表。

3.2.3.2 如果沒有設備標識列和屬性列,如何建模?
- 列數沒有數量限制,可以達到數十萬以上。

3.2.3.3 如果在一個設備下,既有子設備,也有測點,如何建模?
- 每個設備有多個子設備及測點信息,推薦為每類設備建一個表進行管理。

3.3 場景三:雙模型結合
3.3.1 特點
巧妙融合了樹模型與表模型的優點,共用一份數據,寫入靈活,查詢豐富。
數據寫入階段,采用樹模型語法,支持數據靈活接入和擴展。
數據分析階段,采用表模型語法,允許用戶通過標準 SQL 查詢語言,執行復雜的數據分析。
3.3.2 建模示例
3.3.2.1 有多種類型的設備需要管理,如何建模?
場景中不同類型的設備具備不同的層級路徑和測點集合。
樹模型:在數據庫節點下按設備類型創建分支,每種設備下可以有不同的測點結構。
表視圖:為每種類型的設備建立一張表視圖,每個表視圖具有不同的標簽和測點集合。

3.3.2.2 如果沒有設備標識列和屬性列,如何建模?
樹模型:每個測點都有唯一編號,但無法對應到某些設備。
表視圖:將所有測點放入一張表中,測點列數沒有數量限制,可以達到數十萬以上。若測點具有相同的數據類型,可將測點作為同一類設備。

3.3.2.3 如果在一個設備下,既有子設備,也有測點,如何建模?
樹模型:按照物理世界的監測點,對每一層結構進行建模。
表視圖:按照設備分類,建立多個表對每一層結構信息進行管理。
