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约束策略的示例 |
仅支持强约束。 | 不涉及。 | |
支持的约束策略:
|
| |
仅支持强约束。 | 不涉及。 | |
支持的约束策略:
|
| |
支持的约束策略:
|
| |
仅支持无约束。 | 不涉及。 |