开发应用程序的最佳做法 > 资产建模 > 在 ThingWorx 中存储数据
在 ThingWorx 中存储数据
ThingWorx 提供用于存储数据的实体和方法。您可以将数据存储在数据表、事物属性、流、值流和配置表中。
开发应用程序时,您需要考虑如何使用 ThingWorx 处理数据存储。选取正确的数据存储非常重要,因为它会影响到项目的结果、项目的可伸缩性和可靠性,以及用户体验。
以下部分介绍了 ThingWorx 模型中的存储选项:
数据表
用于少于 100,000 行的数据。
用于静态数据集和静态查找表。对于高度动态的大型数据集,请使用通过 Database 事物模板连接的关系数据库。
* 
将关系数据库用于复杂的查询和联接。
用于基于键的查询和存储,以及轻松启用基于主键的更新和删除操作。
例如:您可以存储有关智能连接自动售货机的库存信息,其中,库存中的每个位置都是一个主键。您还可以使用数据表来存储适用于作物管理设备的灌溉程序的相关信息,其中每个灌溉程序各自构成含有主键的行。
要逐行处理或查询数据,请使用数据表。
在处理数据表时,请使用索引。
* 
数据表不支持高速写入,因为它们不具有诸如流和值流之类的队列机制。
事物属性
使用事物属性来存储 ThingWorx 中有关事物的数据。属性具有以下数据存储选项:
只读 - 对于不应在运行时更改的静态值使用只读选项。但是,如果需要,可以更改默认值。
持久化 - 如果希望即使在 ThingWorx 服务器重新启动后也能保存属性值,并且能够在运行时更改属性值,则可以使用持久化选项。
已记录 - 针对值连续更新的属性使用已记录的选项。此为可存储在值流中的时间序列数据。
* 
请勿使用显式属性来存储历史数据。而应使用流或值流进行存储。
用于记录时间驱动的流程事件或与设备相关的活动。
例如,创建一个流来记录有关设备活动的问题,或在设备断开连接并重新连接到 ThingWorx 平台时进行记录。流针对高速写入进行了优化,并且具有可配置的缓存系统。
值流
用于存储从事物属性中获取的时间序列数据。
系统使用流创建了数据表。使用值流时,系统会取消创建稀疏填充的数据表。
以事物为中心访问值流中的数据可为多租户提供内置支持。
如果使用的是 RDMS (PostgreSQL、MSSQL、H2),则所有记录都会写入到数据库中的同一个表中,即使这些记录来自不同事物的不同值流也是如此。
如果使用的是 PostgreSQL,则在 PostgreSQL 数据库的 ValueStream 表中,每一行仅会保存一个属性的记录。这意味着,值流会单独跟踪每个属性的值更改情况。使用 QueryPropertyHistory 服务后,它会检查事物中每个属性的数据流,并将所有最新的更新 (每次更新的时间都不同) 都收集到一个信息表结果中。
下表提供了有关流与值流间主要差异的信息。利用此信息可确定在应用程序中存储时间序列数据所需使用的实体类型:
值流
流可存储任何类型的时间序列数据。
值流可存储事物属性中的时间序列数据。
值流绑定到事物的属性。
您可以通过使用自己的服务直接查询流中的数据。查询的结果是整行数据。
您不能直接查询值流中的数据,而应使用针对事物定义的服务来查询值流中的数据。例如:QueryPropertyHistory
要将一行数据添加到流中,请使用 WritePropertiesToStream 服务。
要将数据添加到值流,请选中属性的“已记录”复选框。
流可存储上下文数据。例如,每当触发特定事件时,您都可以添加其他属性的值。这样做有助于分析数据。
值流不能存储上下文数据。
何时使用流或值流?
使用值流和流来存储和检索时间序列数据。根据需要存储的数据量来选取正确的数据存储选项。
如果只是希望查询某些短时间段内的数据时,可以使用流。
跨多个值流拆分事物,以此提升索引性能。
配置表
用于构建可在 ThingWorx 平台上安全升级的可自定义应用程序。
您可以基于预定义的数据形状针对混搭实体添加配置表。这样可以简化可自定义的扩展混搭的构建流程,同时仍支持就地升级,因为配置表值会在扩展升级期间得以继承。
处理以数据为中心的建模的最佳做法
使用以下一般最佳做法在 ThingWorx 中处理以数据为中心的建模:
如果您的数据不会发生更改,或者在下次更改/加载时会被覆盖,并且与某个事物相关联,则为该事物创建一个信息表属性并为其分配正确的数据形状。如此一来,您便可通过事物来访问数据。您也可以使用配置表,但是如果数据量较大,则可以改用数据表。
尽可能使用数据缓存。
例如,不会针对每个 DataChange 事件查询数据库,而是会将缓存实现为一个信息表,并按设置的间隔进行刷新。
对不再需要的数据进行存档。
设计应用程序时,必须确定哪些数据是常用数据。您可以将这些数据存储在应用程序数据库中。尽快将旧数据迁移到外部服务器,例如 ThingWorx 联合实例或数据库服务器。
提供查询方法的开始和结束日期参数,用以限制查询所能检索的数据量。这样既可以缩短处理时间,又可以提升处理性能。
对于大容量数据提取方案 (提取率超过 ThingWorx Platform 规模度量指南中所述的提取率),请考虑创建多个持久化方案提供工具并将它们连接到单独的数据库实例。这样可确保数据进入数据库中的不同表。如果添加多个数据库,则持久化方案提供工具可以指向特定数据库。在这种情况下,您需要进行数据迁移。
请确保数据表的行数少于 100,000 行。
从数据表和流中查询数据仅需几秒钟。如果这些数据表和流的行数超过 100,000 行,则查询的执行速度会很慢。
请确定您计划清除旧数据的方式。清除数据非常重要,因为这样做有助于提升应用程序的性能。