ThingWorx 模型和数据最佳做法 > 使用 ThingWorx 存储数据 > ThingWorx 以数据为中心的建模
ThingWorx 以数据为中心的建模
选取正确的模型元素
PTC 建议您了解 ThingWorx 建模概念,以便执行本节的剩余部分。有关详细信息,请参阅 Composer 中的 ThingWorx 模型定义。ThingWorx 中的模型是对实体和解决方案环境的逻辑表示。此逻辑表示通过创建内置模型元素模板(例如:事物、事物模板、事物形态和数据形状)的实例来实现。针对基于 ThingWorx 模型的解决方案,本节提供了为其设计数据存储方案的建议。在 ThingWorx 中,有多个选项可用于存储数据。了解每个选项有助于您确定最佳的数据存储方案:
值流
* 
要估算 ThingWorx 满足您的要求所需的处理资源和内存,请使用 规模定制指南
什么是基本类型和数据形状?
ThingWorx 基本类型提供了一个抽象层,可将 ThingWorx 应用程序开发与 Edge 的特定数据类型以及数据存储相隔离。这允许 ThingWorx 应用程序不必考虑数据存储,并且能够在运行时更改基本类型,而无需更改基础数据库架构。
数据形状是一组字段定义和相关元数据的命名集合,其中每个字段都是一个基本类型。数据形状类似于关系数据库表的概念,其中基本类型对应于字段数据类型。
事物属性
ThingWorx Platform 数据接入中最重要的入口点是事物属性,其中互联设备在 ThingWorx 中建模为事物。有关一般说明,请参阅 事物属性
以下用例说明了可用于存储事物属性的不同数据存储选项。其中,“拖拉机”事物具有“拖拉机引擎”事物形态,后者具有以下属性:Max RPMEngine TemperatureLast Oil Service Date
这些属性具有三个数据存储选项:只读、持久化和日志记录。在上述示例中,建议使用以下选择:
Max RPM - 使用“只读”选项,因为这是一个静态值,不应在运行时进行更改。但是,如果引擎已升级,则可通过更改默认值来更改此值。
Last Oil Service Date - 使用持久化选项,因为此属性可在运行时进行更改,而您仅会关注最近的日期。使用持久化选项也可让 ThingWorx 服务器重新启动。
Engine Temperature - 使用已记录选项,因为这是一个不断变化的值,实质上是时间序列数据。
流预期用于存储时间序列数据的 blob。每个流条目都具有时间戳、源、源类型、字段值、数据标记和位置字段。字段列表在数据形状中定义,并与流关联。此字段列表中的字段值作为 JSON 存储在单一列中,或作为文本 blob 存储在流中。因此,当查询单个字段值时,将返回包含匹配字段值的整行或多行。换言之,当查询流以在短时间内返回给定源的字段值时,数据检索的效率会更高。针对特定字段值使用条件查询将导致在应用程序级别筛选字段值数据。
最佳做法包括:
用于任意时间序列数据,这些数据不与 ThingWorx 模型中的事物直接关联 (与值流进行比较)
当不需要使用基于字段值的高级筛选来查询存储的数据时,应使用
当查询受到小时间段约束时,应使用
避免长时间在多个源之间进行查询
值流
值流 值流旨在将事物的各个属性存储为时间系列数据。必须将事物中的属性定义为已记录,才能将其视为时间序列数据,且必须使用值流进行数据存储。每个值流条目都具有时间戳、源、属性类型、属性名称和属性值。这与流的存储模型不同,流将整个字段值集作为 JSON/文本 blob 存储在单个行中的一个字段值列内,而值流将每个属性值与关联的源和时间戳存储在单个行中。在值流中查询事物的属性数据时,仅返回该属性的值。
对于事物驱动的模型,值流非常有用。最佳做法是在多个值流之间分割事物,以提高索引性能。对于一些大容量数据接入方案 (达到甚至超过《规模定制指南》中列举的接入速率),也可以考虑创建多个指向单独数据库实例的持久化方案提供工具,虽然这不是严格意义上的最佳做法。这样可确保数据进入数据库中的不同表。如果添加了多个数据库,则可将持久化方案提供工具指向特定数据库。以上方案也需要进行数据迁移。
如果使用的是 RDMS (PostgreSQL、MSSQL、H2),则所有记录都会写入到数据库中的同一个表中,即使这些记录来自不同事物的不同值流也是如此。
如果使用的是 PostgreSQL,则在 PostgreSQL 数据库的 ValueStream 表中,每一行仅会保存一个属性的记录。这意味着,值流单独跟踪每个属性的值更改,在使用 QueryPropertyHistory 服务后检查事物中每个属性的数据流,并将所有最新的更新 (每个更新都有不同的更新时间) 收集到一个信息表结果中。
数据表
数据表是一个 ThingWorx 实体,它实质上是标准关系数据库表的抽象,可用于简化和加速 ThingWorx 应用程序开发。但是,需要注意的是,数据表的后端实现不等同于关系数据库表,并且不具有关系数据库表的全部灵活性。数据表作为第一类 ThingWorx 实体,可以更简便地在 ThingWorx 模型级别处理数据访问功能。与数据表关联的数据形状用于定义数据表的列或字段及其主键。但是,这并不意味着数据表可以在性能和可扩展性方面取代标准的关系数据库表。
有关详细信息,请参阅 数据表最佳业务实践数据表的大小限制