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 della soluzione è 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 usare le tabelle dati per memorizzare 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 le tabelle dati.
Utilizzare gli indici quando si lavora con tabelle dati.
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 da o si riconnette aThingWorx Platform. 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 le tabelle dati. Quando si utilizzano gli stream di valori, la creazione di tabelle dati parzialmente completate viene eliminata.
Questo accesso (incentrato sugli oggetti) dei dati 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 provengono 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.
Nella tabella seguente sono riportate le informazioni sulle principali differenze tra gli stream e gli stream di valori. Utilizzare queste informazioni per scegliere il tipo di entità da usare per memorizzare i dati di serie temporali nella soluzione.
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 gli stream e gli stream di valori per memorizzare e recuperare i dati di serie temporali. Scegliere l'opzione di archiviazione dati corretta in base alla quantità di dati che è necessario memorizzare.
Utilizzare gli 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
Utilizzarla per creare soluzioni personalizzabili e aggiornabili in modo sicuro inThingWorx Platform.
È 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 nel sistema, perché i valori della tabella di configurazione vengono mantenuti durante gli aggiornamenti dell'estensione.
Ripristino dall'interruzione del database per i provider di dati
In caso di riavvio o interruzione del database, se i dati inseriti non vengono resi persistenti nei provider di dati, si può configurare il sistema per riprovare le operazioni per evitare la perdita di dati impostando le proprietà configurabili riportate di seguito per il provider di persistenza obbligatorio in platform-settings.json.
acquireRetryAttempts: definisce il numero di volte che ThingWorx tenta di acquisire una nuova connessione dal database prima di rinunciare.
acquireRetryDelay: tempo (in millisecondi) di attesa di ThingWorx tra un tentativo di acquisizione e l'altro.
Di conseguenza, ThingWorx ritenta fino al numero di volte indicato da acquireRetryAttempts, con un ritardo di acquireRetryDelay tra ogni tentativo, in base alle impostazioni configurate (ad esempio, se ThingWorx deve attendere 5 secondi perché il database torni online, impostare acquireRetryAttempts=5 e acquireRetryDelay= 1000).
Se nessun tentativo riesce, nel Log applicazioni viene registrato il messaggio di errore seguente, che indica che le voci non sono state rese persistenti: Failed to connect to persistence provider after retrying 5 times in 10 seconds.
* 
È consigliabile non impostare acquireRetryAttempts su un valore minore di o uguale a zero, in quanto i tentativi dell'applicazione rendere persistenti le voci vengono ripetuti all'infinito e questo potrebbe comportare la sospensione della piattaforma nel caso di un'interruzione del database prolungata.
Durante l'utilizzo di InfluxDB come provider di persistenza facoltativo, è necessario configurare DatabaseWriteRetryAttempts per riprovare le operazioni del database in base al numero di volte configurato.
* 
Per le proprietà persistenti e registrate che vengono modificate di frequente, si verifica una perdita minima di dati inevitabile a causa dell'elaborazione basata su batch. In questi scenari, in Log applicazioni vengono registrati i messaggi riportati di seguito.
Per la proprietà persistente: BatchUpdateException error occurred executing batch update of persistent properties.
Per le proprietà registrate o l'inserimento di ValueStream: Error executing batch.
* 
Le dimensioni della coda devono essere configurate in modo appropriato per contenere i dati in base alla frequenza di inserimento.
Per ulteriori informazioni sulle prestazioni, vedere Report delle prestazioni.
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à di infotable per tale oggetto e assegnare una data shape appropriata. In questo modo è possibile accedere ai dati tramite l'oggetto. È inoltre possibile usare le 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 della soluzione è necessario determinare quali dati vengono utilizzati di frequente. Questi dati possono essere memorizzati nel database della soluzione. 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 d'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 in quanto consente di migliorare le prestazioni di una soluzione.
È stato utile?