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約束策略的示例 |
僅支持強約束。 | 不涉及。 | |
支持的約束策略:
|
| |
僅支持強約束。 | 不涉及。 | |
支持的約束策略:
|
| |
支持的約束策略:
|
| |
僅支持無約束。 | 不涉及。 |