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列。
写入数据的相同字段的数据类型发生变化时时序引擎会检测到字段的数据类型不匹配而写入失败,需要使用ALTER TABLE语句手动修改字段的数据类型。
说明弱约束策略并不意味着完全没有校验。例如给一个TAG列写入一个非字符串,或给时间戳列写入非时间戳类型时,仍然会触发校验失败。
无约束
不做任何约束。代价是无法直接通过SQL查询写入的数据。
说明无约束并不能主动选择,是出于兼容旧版TSDB接口而保留的一种策略。
无约束策略下写入的数据无法直接通过SQL进行查询。
数据写入方式与Schema约束的选择
在Lindorm时序引擎中,数据写入时的Schema约束策略与数据的写入方式是密切相关的,以下表格基于时序引擎应用开发简介中介绍的数据访问方式以及数据生态中介绍的开源协议兼容的写入方式分别概括不同的写入方式对应的Schema约束策略:
写入方式 | Schema约束策略 | 备注 |
通过JDBC API写入数据 | 强约束 | 不涉及。 |
可选项。支持强约束和弱约束。 |
| |
通过api/v2/sql使用INSERT写入数据 | 强约束 | 不涉及。 |
通过行协议写入数据 | 可选项。支持强约束和弱约束。 |
|