ThingWorx でのデータの保管
ThingWorx はデータを保管するためのエンティティおよびメソッドを提供します。データテーブル、Thing プロパティ、ストリーム、値ストリーム、コンフィギュレーションテーブルにデータを保管できます。
アプリケーションを開発しているときには、ThingWorx によってデータストレージがどのように処理されるかについて考慮する必要があります。正しいデータストレージを選択することは、プロジェクトの結果、そのスケーラビリティ、信頼性、ユーザーエクスペリエンスに影響するので、非常に重要です。
次のセクションでは、ThingWorx モデルにおけるストレージオプションについて説明します。
データテーブル
100,000 行未満のデータに使用します。
静的データセットおよび静的検索テーブルに使用します。非常に動的で大きなデータセットの場合、Database Thing Template を介して接続されるリレーショナルデータベースを使用します。
* 
複雑なクエリーおよび結合にはリレーショナルデータベースを使用します。
キーベースのクエリーおよびストレージや、プライマリキーに基づいた更新と削除を簡単に行うために使用します。
例: スマートコネクティッド製品である自動販売機の在庫に関する情報を保管でき、ここでは在庫内の各位置がプライマリキーとなります。データテーブルを使用して、作物管理デバイスに使用可能な灌漑プログラムに関する情報も保管でき、ここでは各灌漑プログラムがプライマリキーの行となります。
データを 1 行ずつ操作またはクエリーするには、データテーブルを使用します。
データテーブルを操作する際にはインデックスを使用します。
* 
データテーブルにはストリームや値ストリームのようなキューメカニズムがないので、高速書き込みはサポートされません。
Thing プロパティ
Thing に関するデータを ThingWorx に保管するには、Thing プロパティを使用します。各プロパティには以下のデータストレージオプションがあります。
読み取り専用 - ランタイムに変更してはならない静的な値には読み取り専用オプションを使用します。ただし、必要な場合、デフォルト値を変更できます。
永続化 - ThingWorx サーバーが再起動した後もプロパティの値を保存する場合や、プロパティの値をランタイムに変更することが可能な場合、永続化オプションを使用します。
ログ記録 - 値が常に更新されるプロパティにはログ記録オプションを使用します。これは値ストリームに保管することが可能な時系列データです。
* 
履歴データの保管に明示的プロパティを使用しないでください。代わりに、ストリームまたは値ストリームを使用します。
ストリーム
お使いのデバイスに関連する時間駆動のプロセスイベントまたはアクティビティの記録に使用します。
たとえば、デバイスのアクティビティに関する問題を記録するストリームや、デバイスが ThingWorx プラットフォームから切断された時刻と再接続された時刻を記録するストリームを作成します。ストリームは高速書き込み用に最適化され、設定可能なキャッシュシステムを備えています。
値ストリーム
Thing のプロパティから取得された時系列データの保管に使用します。
ストリームでは、データテーブルが作成されます。値ストリームを使用した場合、値がまばらに設定されているデータテーブルは作成されません。
値ストリームでは、データへのアクセスが Thing 中心であることから、マルチテナント性が本質的に備わっています。
RDMS (PostgreSQL、MSSQL、H2) を使用している場合、さまざまな Thing のさまざまな値ストリームのレコードを含むすべてのレコードが、データベース内の同じテーブルに書き込まれます。
PostgreSQL を使用している場合、PostgreSQL データベース内の値ストリームのテーブル内で、各行に 1 つのプロパティのレコードだけが格納されます。つまり、値ストリームは各プロパティの値の変化を個別に追跡します。QueryPropertyHistory サービスを使用すると、Thing 内の各プロパティのデータフローがチェックされ、(更新時刻がそれぞれ異なる) すべての最新の更新がインフォテーブルの 1 つの結果内に収集されます。
以下の表に、ストリームと値ストリームの主な違いに関する情報を示します。この情報を基に、アプリケーションで時系列データを保管するときに使用するエンティティのタイプを決定します。
ストリーム
値ストリーム
ストリームにはあらゆるタイプの時系列データを保管できます。
値ストリームには Thing のプロパティの時系列データを保管できます。
値ストリームは Thing のプロパティにバインドされています。
ストリーム独自のサービスを使用してストリームのデータを直接クエリーできます。クエリーの結果としてデータの行全体が返されます。
値ストリームからデータを直接クエリーすることはできません。代わりに、Thing に定義されているサービスを使用して、値ストリームのデータをクエリーします。例: QueryPropertyHistory
データの行をストリームに追加するには、WritePropertiesToStream サービスを使用します。
データを値ストリームに追加するには、プロパティの「ログ記録」チェックボックスをオンにします。
ストリームにはコンテキストデータを保管できます。たとえば、特定のイベントがトリガーされた場合に必ず、ほかのプロパティの値を追加できます。これはデータの解析に役立ちます。
値ストリームにはコンテキストデータを保管することはできません。
どのような場合にストリームまたは値ストリームを使用するか?
値ストリームおよびストリームは時系列データを保管および取得するときに使用します。保管する必要があるデータの量に応じて、適切なデータストレージのオプションを選択します。
ストリームは、短い期間内のみのデータをクエリーする場合に使用します。
インデックスのパフォーマンスを向上させるには、Thing を複数の値ストリームに分割します。
コンフィギュレーションテーブル
ThingWorx プラットフォーム上で安全にアップグレード可能な、カスタマイズ可能なアプリケーションを構築するときに使用します。
事前に定義されているデータシェイプに基づいて、マッシュアップエンティティにコンフィギュレーションテーブルを追加できます。これにより、拡張機能のアップグレード時にコンフィギュレーションテーブルの値が継承されるので、カスタマイズ可能な拡張マッシュアップを構築するプロセスが簡素化されるとともに、インプレースアップグレードもサポートされます。
データ中心モデリングを処理する際の最良事例
ThingWorx でデータ中心モデリングを処理する際には、以下の一般的な最良事例を使用します。
データが変化しないか、次回に変更/ロードされたときにオーバーライドされ、Thing に関連付けられている場合、その Thing にインフォテーブルプロパティを作成し、適切なデータシェイプを割り当てます。この方法によって、Thing を介してデータにアクセスできます。コンフィギュレーションテーブルか、データ量が多い場合にはデータテーブルも使用できます。
できるかぎりデータキャッシュを使用します。
たとえば、DataChange イベントごとにデータベースをクエリーする代わりに、インフォテーブルとして、一定間隔で再表示されるキャッシュを実装します。
不要になったデータはアーカイブします。
アプリケーションを設計する際には、どのデータを頻繁に使用するかを決定しなければなりません。このデータをアプリケーションデータベースに保管できます。ThingWorx フェデレーションインスタンスやデータベースサーバーなどの外部サーバーに、できるだけ早く古いデータを移動します。
開始日および終了日のパラメータをクエリーメソッドに指定することで、クエリーで取得するデータの量を制限します。これによって処理時間が短くなり、パフォーマンスが向上します。
( ThingWorx Platform Sizing Guide で概要を説明している取得レートを上回る) 大容量のデータを取得するシナリオでは、別個のデータベースインスタンスに接続する複数の永続化プロバイダを作成することを検討してください。これにより、データはデータベース内の異なるテーブルに格納されます。複数のデータベースを追加した場合、各永続化プロバイダが固有のデータベースを指すことがあります。この場合、データの移行が必要です。
データテーブルの行数が 100,000 未満であることを確認します。
データテーブルおよびストリームのデータのクエリーは数秒で行われなければなりません。これらのデータテーブルおよびストリームに 100,000 行以上ある場合、クエリーのパフォーマンスが低下します。
古いデータのパージ方法を必ず計画します。データのパージは、アプリケーションのパフォーマンス向上に役立つため、重要です。