Schema约束

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"}'

单值写入

仅支持无约束。

不涉及。