全部產品
Search
文件中心

Lindorm:Schema約束

更新時間:Jul 06, 2024

Schema約束策略決定了資料寫入時是否校正表是否存在、表結構是否一致、欄位的資料類型是否一致。不同的資料寫入方式,支援的Schema約束策略不同。本文介紹Lindorm時序引擎Schema約束的概念和使用。

Lindorm時序模型的Schema

Lindorm時序引擎基於對時序領域中業務資料模型的理解與洞察,抽象出了時序資料表這一概念。因此,開發人員在開發基於Lindorm時序引擎的應用程式時,可以類比傳統關係型資料庫中的關係表來訪問時序資料。

但是,時序資料模型本質上與關係型資料模型還是有所區別的。無論是在APM領域,還是IoT領域,或者是更偏傳統的工業領域,時序資料所表現出的資料模型更像是一個半結構化資料——有其遵循結構化定義的一面、也有可靈活擴充的一面,而不是完全等同於關係型資料庫的純結構化。而在實際應用中,隨著裝置的不斷改進、升級、迭代,裝置上報的資料模型變化可能也會很頻繁,包括裝置上報欄位的增加,欄位類型的變更等等。

儘管在Lindorm時序引擎中,提供了ALTER TABLE語句用於變更時序資料表。但是在一部分時序應用情境下,如果對錶的Schema約束嚴格如關係型資料庫,那麼則有可能使應用開發變得更加困難。

在此背景下,Lindorm時序引擎提供了更加靈活的Schema約束策略。

Schema約束的含義

Schema約束通常體現在資料寫入層面,即寫入的欄位是否與預先定義的表結構中包含的欄位一致,寫入的欄位資料類型是否與預先定義的資料類型一致或相容,甚至寫入的表是否存在等等。在傳統關係型資料庫中,這些約束非常嚴格。

在Lindorm時序引擎中的Schema約束指的是以下行為:

  • 校正資料寫入的目標表是否存在

  • 校正資料寫入的標籤(Tag)或量測值(Field)是否已預先定義

  • 校正資料寫入的資料類型與預先定義的資料類型是否一致

  • 保障資料查詢時欄位傳回型別的一致性

支援的Schema約束策略

Lindorm時序引擎目前提供三種Schema約束策略,分別是強約束弱約束無約束。您可結合具體的業務需求選擇約束策略。

  • 強約束

    與傳統關係型資料庫類似,時序引擎會嚴格依據預先定義的表結構對寫入資料的表名、欄位名、資料類型進行校正。不匹配則寫入失敗。

  • 弱約束

    • 寫入資料的表不存在時,時序引擎不會報錯,而是會自動建立對應的表。

    • 寫入資料的新增一個標籤(Tag)或量測值(Field)時,時序引擎不會報錯,而是會在對應的時序資料表中自動添加一個標籤(Tag)欄位或量測值(Field)欄位。

    • 寫入資料的相同欄位的資料類型發生變化時,時序引擎會檢測到欄位的資料類型不匹配而寫入失敗。此時,請您執行ALTER TABLE語句手動修改欄位的資料類型。

    說明

    弱約束策略並不意味著完全沒有校正。例如給標籤(Tag)欄位寫入非字串資料,或給時間戳記欄位寫入非時間戳記資料時,仍然會觸發校正失敗。

  • 無約束

    不做任何約束。寫入資料的表不存在時,時序引擎不會報錯,寫入的資料可以通過相容TSDB介面查詢。 如果手動建立了表,則可以使用SQL查詢,但是欄位的資料類型不匹配不會報錯。

    說明

    無約束是為了相容舊版TSDB介面而保留的一種策略,不建議使用無約束策略。

資料寫入方式與Schema約束的選擇

在Lindorm時序引擎中,資料寫入時的Schema約束策略與資料的寫入方式是密切相關的,具體如下表所示。

寫入方式

Schema約束策略

修改Schema約束策略的樣本

JDBC Driver

僅支援強約束。

不涉及。

Java Native SDK

支援的約束策略:

  • 強約束(預設值)

  • 弱約束

  • 無約束

// 串連地址
String url = "http://ld-bp1489gr5t*****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242";
// 建立用戶端,LindormTSDBClient安全執行緒,可以重複使用,無需頻繁建立和銷毀
ClientOptions options = ClientOptions
        .newBuilder(url)
        .setSchemaPolicy(SchemaPolicy.WEAK)
        .build();
LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);

HTTP SQL API

僅支援強約束。

不涉及。

行協議

支援的約束策略:

  • 強約束

  • 弱約束(預設值)

  • 無約束

curl -X POST 'http://ld-bp1489gr5t*****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242/api/v2/write?db=default&schema_policy=WEAK' -d 'sensor,device_id=F07A1260,region=north-cn temperature=12.1,humidity=45 1619076780000'

多值寫入

支援的約束策略:

  • 弱約束

  • 強約束

  • 無約束(預設值)

 curl -X POST http://ld-bp1489gr5t*****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242/api/config -d'{"schema.policy.opentsdb":"WEAK"}'

單值寫入

僅支援無約束。

不涉及。