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約束策略的樣本 |
僅支援強約束。 | 不涉及。 | |
支援的約束策略:
| | |
僅支援強約束。 | 不涉及。 | |
支援的約束策略:
| | |
支援的約束策略:
| | |
僅支援無約束。 | 不涉及。 |