Namun Basis Data TimeSeries Lainnya adalah basis data rangkaian waktu eksperimental yang terinspirasi InfluxDb dan RavenDB .
YATsDb diimplementasikan dalam .NET murni dan C# modern dengan kinerja luar biasa, (sekitar 30K penyisipan per detik pada CPU Intel i7-8550U, 1,80GHz, RAM 24GB, SSD - memasukkan baris satu per satu).
Saya memerlukan database deret waktu untuk proyek IoT rumahan, tetapi menggunakan InfluxDb akan membosankan. Implementasi prototipe yang dapat memasukkan data dan mengajukan pertanyaan hanya membutuhkan waktu 12 jam.
YATsDb adalah implementasi database lengkap dengan GUI, definisi OpenAPI, dan pekerjaan. Ini membutuhkan runtime .NET 8 untuk dijalankan.
YATsDb.Lite adalah versi kompilasi AOT dengan fungsionalitas database deret waktu inti. Ia tidak memiliki ketergantungan pada sistem target.
Biner yang dihasilkan relatif kecil <15MB .
Berikut ini adalah contoh penggunaan YATsDb/YATsDb.Litle menggunakan cURL ( YATsDb juga menyediakan definisi titik akhir OpenAPI).
Dalam contoh ini, URL dasarnya adalah http://localhost:8080/.
Buat keranjang baru smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
Masukkan data sampel dalam format baris sederhana ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
), format ini terinspirasi oleh InfluxDb , tetapi tidak menggunakan nilai bernama , tetapi nilai posisi. Selain itu, sebelum InfluxDb , stempel waktu unix dalam milidetik selalu digunakan sebagai waktu.
Contoh data berikut mewakili data dari pengukuran sensor di rumah - suhu, kelembaban, intensitas cahaya.
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 "
Dimungkinkan untuk mengirim beberapa baris dalam satu pesan, tetapi tidak semua shell mendukung hal ini.
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 mengizinkan pembuatan kueri dalam sintaksis yang menyerupai SQL, tetapi menggunakan posisi nilai, bukan nama. Hasil query adalah hasil JSON.
Pilih data kelembapan dari Kamar2 yang lebih lama dari 12 jam:
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 "
Tata bahasa lengkap untuk memasukkan data data - protokol baris sederhana:
<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
Pengukuran tanpa tag:
sensors_data 12.5 1608852317000
Pengukuran dengan tag:
sensors_data,home/room3/esp32 12.5 1608852317000
Pengukuran dengan beberapa nilai:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
Pengukuran dengan nilai yang hilang (gunakan NULL
untuk nilai yang hilang):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
Pengukuran tanpa stempel waktu unix - waktu server saat ini digunakan:
sensors_data,home/room3/esp32 12.5
Nilai multibaris:
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
Tata bahasa lengkap untuk menanyakan data:
<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 }
Pilih semua data:
SELECT * FROM sensors_data
Pilih 5 rekaman pertama dari Room3 :
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
Pilih grup data suhu selama 10 menit:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Pilih data kelembaban dari Kamar2 :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
Pilih data kelembapan dari Kamar2 yang lebih tua dari 12 jam:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
Pilih catatan terakhir:
SELECT * FROM sensors_data LIMIT ..1
Kelompokkan semua data:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
Pilih berdasarkan waktu tertentu (menggunakan stempel waktu unix dalam milidetik):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
Pilih berdasarkan waktu tertentu (menggunakan waktu yang dapat dibaca manusia):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m