Memorizzazione dei dati in ThingWorx
ThingWorx fornisce entità e metodi per memorizzare i dati. È possibile memorizzare i dati in tabelle dati, proprietà degli oggetti, stream, stream di valori e tabelle di configurazione.
Durante lo sviluppo dell'applicazione, è necessario considerare come ThingWorx gestisce l'archiviazione dati. La scelta dell'archiviazione dati corretta è molto importante poiché influisce sul risultato, la scalabilità e l'affidabilità del progetto e sul livello di percezione e interazione dell'utente con il prodotto.
La sezione riportata di seguito descrive le opzioni di memorizzazione nel modello ThingWorx.
Tabella dati
Utilizzare per meno di 100.000 righe di dati.
Utilizzare per insiemi di valori e tabelle di ricerca statici. Per insiemi di dati altamente dinamici e di maggiori dimensioni usare un database relazionale connesso tramite un modello di oggetto Database.
* 
Per interrogazioni e join complessi utilizzare un database relazionale.
Utilizzare per la memorizzazione e le interrogazioni basate su chiave, nonché per facilitare gli aggiornamenti e le eliminazioni in base alla chiave principale.
Ad esempio è possibile memorizzare le informazioni di inventario di un distributore automatico intelligente e connesso utilizzando una chiave principale per ogni posizione in inventario. Si possono inoltre memorizzare in tabelle dati le informazioni sui programmi di irrigazione disponibili per un dispositivo per la gestione delle colture utilizzando una riga con una chiave principale per ogni programma di irrigazione.
Per manipolare o interrogare i dati riga per riga, utilizzare tabelle dati.
Utilizzare indici quando si lavora con tabelle dati.
* 
Le tabelle dati non supportano la scrittura ad alta velocità, poiché non dispongono di un meccanismo di accodamento come gli stream e gli stream di valori.
Proprietà degli oggetti
Utilizzare le proprietà dell'oggetto per memorizzare i dati relativi a un oggetto in ThingWorx. Le proprietà offrono le opzioni di archiviazione dati descritte di seguito.
Sola lettura - Utilizzare questa opzione per valori statici che non devono essere modificati in fase di esecuzione. Se lo si desidera, tuttavia, è possibile modificare il valore di default.
Persistente - Utilizzare questa opzione se si desidera che il valore della proprietà sia salvato anche dopo il riavvio del server ThingWorx e se il valore della proprietà può essere modificato in fase di esecuzione.
Registrata - Utilizzare questa opzione per le proprietà i cui valori vengono aggiornati continuamente. Si tratta di dati di serie temporali che possono essere memorizzati in stream di valori.
* 
Non utilizzare proprietà esplicite per memorizzare dati cronologici. Utilizzare invece stream o stream di valori.
Stream
Utilizzare per registrare attività o eventi di processo su base temporale correlati ai dispositivi.
Ad esempio, creare uno stream per registrare i problemi relativi alle attività del dispositivo o per registrare quando il dispositivo si disconnette o si riconnette alla piattaforma ThingWorx. Gli stream sono ottimizzati per la scrittura ad alta velocità e dispongono di un sistema di cache configurabile.
Stream di valori
Utilizzare per memorizzare i dati di serie temporali ottenuti dalle proprietà di un oggetto.
Con gli stream vengono create tabelle dati. Quando si utilizzano stream di valori, la creazione di tabelle dati parzialmente completate viene eliminata.
Questo accesso dei dati incentrato sugli oggetti in uno stream di valori offre supporto incorporato per il multi-tenancy.
Se si utilizza un sistema RDMS (PostgreSQL, MSSQL o H2), tutti i record vengono scritti nella stessa tabella del database, anche se provenienti da stream di valori diversi per oggetti diversi.
Se si utilizza PostgreSQL, nella tabella per ValueStream del database PostgreSQL ogni riga contiene il record per una sola proprietà. Lo stream di valori tiene pertanto traccia della modifica del valore di ogni proprietà in modo indipendente. Dopo l'utilizzo del servizio QueryPropertyHistory viene controllato il flusso di dati per ogni proprietà nell'oggetto e tutti gli aggiornamenti più recenti (ciascuno con una diversa ora di aggiornamento) vengono raccolti in un unico risultato nella infotable.
La tabella riportata di seguito contiene informazioni sulle principali differenze tra stream e stream di valori. Utilizzare queste informazioni per decidere il tipo di entità da utilizzare per memorizzare i dati di serie temporali nell'applicazione.
Stream
Stream di valori
Negli stream può essere memorizzato qualsiasi tipo di dati di serie temporali.
Negli stream di valori possono essere memorizzati i dati di serie temporali della proprietà di un oggetto.
Gli stream di valori sono associati alle proprietà di un oggetto.
È possibile interrogare direttamente i dati degli stream utilizzando i relativi servizi. Il risultato dell'interrogazione è l'intera riga di dati.
Non è possibile interrogare direttamente i dati degli stream di valori. Per interrogare i dati dello stream di valori utilizzare invece i servizi definiti nell'oggetto. ad esempio QueryPropertyHistory.
Per aggiungere una riga di dati a uno stream, utilizzare il servizio WritePropertiesToStream.
Per aggiungere dati a uno stream di valori, selezionare la casella di controllo Registrata per una proprietà.
Negli stream possono essere memorizzati dati contestuali. Ad esempio è possibile aggiungere i valori delle altre proprietà ogni volta che viene attivato un evento specifico. Ciò è utile per l'analisi dei dati.
Negli stream di valori non possono essere memorizzati dati contestuali.
Casi di utilizzo di stream e stream di valori
Utilizzare stream di valori e stream per memorizzare e recuperare dati di serie temporali. Scegliere l'opzione di archiviazione dati corretta in base alla quantità di dati che è necessario memorizzare.
Utilizzare stream quando si desidera interrogare i dati solo per periodi di tempo limitati.
Suddividere gli oggetti in diversi stream di valori per migliorare le prestazioni dell'indice.
Tabella di configurazione
Utilizzare per creare applicazioni personalizzabili e aggiornabili in modo sicuro nella piattaforma ThingWorx.
È possibile aggiungere una tabella di configurazione in un'entità mashup in base a una data shape predefinita. Questo semplifica il processo di creazione di mashup di estensione personalizzabili, pur supportando comunque aggiornamenti sul posto, poiché i valori della tabella di configurazione vengono mantenuti durante gli aggiornamenti dell'estensione.
Best practice per la gestione della modellazione incentrata sui dati
Per gestire la modellazione incentrata sui dati in ThingWorx, attenersi alle best practice generali descritte di seguito.
Se sono presenti dati che rimangono invariati o vengono sovrascritti alla modifica o al caricamento successivo e sono associati a un oggetto, creare una proprietà infotable per tale oggetto e assegnare una data shape appropriata. In questo modo è possibile accedere ai dati tramite l'oggetto. È anche possibile utilizzare tabelle di configurazione oppure, per quantità maggiori di dati, una tabella dati.
Utilizzare il più possibile la memorizzazione dei dati nella cache.
Anziché interrogare il database per ogni evento DataChange, ad esempio, implementare una cache, sotto forma di infotable, che venga aggiornata agli intervalli impostati.
Archiviare i dati non più necessari.
Durante la progettazione dell'applicazione, è necessario determinare quali dati vengono utilizzati di frequente. Questi dati possono essere memorizzati nel database dell'applicazione. Spostare appena possibile i dati meno recenti in un server esterno, ad esempio un server di database o un'istanza federata di ThingWorx.
Fornire i parametri di data di inizio e di fine ai metodi di interrogazione per limitare la quantità di dati recuperata dall'interrogazione. Ciò riduce il tempo di elaborazione e migliora le prestazioni.
Per gli scenari di inserimento dati con volumi elevati (superiori alle velocità di inserimento riportate nella ThingWorx Platform Sizing Guide), valutare la possibilità di creare più provider di persistenza che si connettono a istanze separate del database. Ciò garantisce che i dati vengano inseriti in tabelle diverse del database. Se si aggiungono più database, i provider di persistenza possono puntare a database specifici. In questo caso è necessario eseguire la migrazione dei dati.
Assicurarsi che le tabelle dati contengano meno di 100.000 righe.
L'interrogazione dei dati di tabelle dati e stream deve richiedere pochi secondi. Se le tabelle dati e gli stream contengono più di 100.000 righe, l'esecuzione delle interrogazioni è lenta.
Assicurarsi di pianificare le modalità di eliminazione dei dati meno recenti. L'eliminazione dei dati è importante, poiché consente di migliorare le prestazioni di un'applicazione.