Pourtant, une autre base de données TimeSeries est une base de données expérimentale de séries chronologiques inspirée d'InfluxDb et RavenDB .
YATsDb est implémenté en .NET pur et en C# moderne avec d'excellentes performances (environ 30 000 insertions par seconde sur un processeur Intel i7-8550U, 1,80 GHz, 24 Go de RAM, SSD - iser les lignes une par une).
J'avais besoin d'une base de données de séries temporelles pour les projets IoT domestiques, mais utiliser InfluxDb serait ennuyeux. La mise en œuvre du prototype, qui savait saisir des données et interroger, n'a pris que 12 heures.
YATsDb est une implémentation complète de base de données avec une interface graphique, des définitions et des tâches OpenAPI. Son exécution nécessite le runtime .NET 8.
YATsDb.Lite est une version compilée AOT avec une fonctionnalité de base de données de séries chronologiques de base. Il n'a aucune dépendance sur les systèmes cibles.
Le binaire résultant est relativement petit < 15 Mo.
Voici un exemple d'utilisation de YATsDb/YATsDb.Litle à l'aide de cURL ( YATsDb fournit également une définition de point de terminaison OpenAPI).
Dans les exemples, l'URL de base est http://localhost:8080/.
Créez un nouveau bucket smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
Saisissez des exemples de données au format de ligne simple ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
), ce format est inspiré de InfluxDb , mais n'utilise pas de valeurs nommées , mais des valeurs de position. De plus, avant InfluxDb , l'horodatage Unix en millisecondes est toujours utilisé comme heure.
Les exemples de données suivants représentent les données de mesure à domicile des capteurs : température, humidité, intensité lumineuse.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719242779202 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.1,39.4,75.0 1719243079200 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.2,41.7,NULL 1719243379246 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 23.0,41,80.4 1719243379256 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719243679194 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 22.7,47.4,NULL 1719243979257 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.1,47,NULL 1719244279035 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room3 18.7,NULL,NULL 1719244579031 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109 "
Il est possible d'envoyer plusieurs lignes dans un seul message, mais tous les shells ne le prennent pas en charge.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109
sensors_data,Room1 24.8,55.7,3.9 1719244899109 "
YATsDb permet d'effectuer des requêtes dans une syntaxe qui ressemble à SQL, mais utilise des positions de valeur au lieu de noms. Le résultat de la requête est un résultat JSON.
Sélectionnez les données d'humidité de la pièce 2 datant de plus de 12 heures :
curl -XPOST http://localhost:8080/query/raw/smart_home --data-binary " SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -10h) GROUP BY +10m "
Grammaire complète pour l'insertion de données - protocole de ligne simple :
<lines> ::= <line> [ [r]n...n ]
<line> ::= <measurement> <values> [<timestamp>]
<measurement> ::= measurement_name [, tag]
<values> ::= <value> [, ...250]
<value> ::={ double_value | NULL }
<timestamp> ::= unix timestamp in milliseconds
Mesure sans étiquette :
sensors_data 12.5 1608852317000
Mesure avec étiquette :
sensors_data,home/room3/esp32 12.5 1608852317000
Mesure avec plusieurs valeurs :
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
Mesure avec valeurs manquantes (utilisez NULL
pour valeur manquante) :
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
Mesure sans horodatage Unix - l'heure actuelle du serveur est utilisée :
sensors_data,home/room3/esp32 12.5
Valeurs multilignes :
sensors_data,home/room3/esp32 12.5 1608852317000
pc_data,Workstation1 25.78,47.5,236566 1608852317900
sensors_data,home/room3/esp32 13.5 1608852417000
Grammaire complète pour interroger des données :
<SELECT statement> ::= SELECT <projection statement> FROM measurement_name
[<WHERE statement>]
[<GROUPBY statement>]
[<LIMIT statement>]
<projection statement> ::= { * | <projection> [ ,...250 ]}
<projection> ::= <projection function>(<index>)
<projection function> ::= { VARIANCE | SUM | COUNT | AVG | IDENTITY | MAX | MIN | STDDEV | REMEDIAN | SIGN | CHANGE_PER_SEC | CHANGE_PER_HOUR | CHANGE_PER_DAY }
<index> ::= integer_number
<WHERE statement> ::= WHERE <where function> [AND ...n]
<where function> ::= { TAG(<string>) | INTERVAL(<interval exp>, <interval exp>) }
<string> ::= string
<interval exp> ::= { integer_number | <time span> | <string> | NOW() }
<time span> ::= { + | - }double_value{ ms | s | m | h | d | w | y }
<GROUPBY statement> ::= GROUP BY <time span>
<LIMIT statement> ::= LIMIT { integer_number | integer_number, integer_number | ..integer_number }
Sélectionnez toutes les données :
SELECT * FROM sensors_data
Sélectionnez les 5 premiers enregistrements de Room3 :
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
Sélectionnez le groupe de données de température par 10 minutes :
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Sélectionnez les données d'humidité de la pièce 2 :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
Sélectionnez les données d'humidité de la pièce 2 datant de plus de 12 heures :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
Sélectionnez le dernier enregistrement :
SELECT * FROM sensors_data LIMIT ..1
Regrouper toutes les données :
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
Sélectionnez par heure concrète (en utilisant l'horodatage Unix en millisecondes) :
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
Sélectionnez par heure concrète (en utilisant une heure lisible par l'homme) :
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m