ฐานข้อมูล TimeSeries อื่น เป็นฐานข้อมูลอนุกรมเวลาทดลองที่ได้รับแรงบันดาลใจจาก InfluxDb และ RavenDB
YATsDb ถูกนำไปใช้ใน .NET ล้วนๆ และ C# สมัยใหม่พร้อมประสิทธิภาพที่ยอดเยี่ยม (ประมาณ 30,000 แทรกต่อวินาทีบน CPU Intel i7-8550U, 1.80GHz, 24GB RAM, SSD - จัดเรียงแถวทีละแถว)
ฉันต้องการฐานข้อมูลอนุกรมเวลาสำหรับโครงการ IoT ในบ้าน แต่การใช้ InfluxDb คงน่าเบื่อ การนำต้นแบบไปใช้ซึ่งรู้วิธีป้อนข้อมูลและสอบถามข้อมูลใช้เวลาเพียง 12 ชั่วโมงเท่านั้น
YATsDb เป็นการใช้งานฐานข้อมูลที่สมบูรณ์พร้อม GUI, คำจำกัดความของ OpenAPI และงาน ต้องใช้รันไทม์ .NET 8 จึงจะทำงานได้
YATsDb.Lite เป็นเวอร์ชันที่คอมไพล์ของ AOT พร้อมด้วยฟังก์ชันฐานข้อมูลอนุกรมเวลาหลัก ไม่มีการพึ่งพาระบบเป้าหมาย
ไบนารีที่ได้ผลลัพธ์มีขนาดค่อนข้างเล็ก < 15MB
ต่อไปนี้เป็นตัวอย่างของการใช้ YATsDb/YATsDb.Litle โดยใช้ cURL ( YATsDb ยังมีคำจำกัดความตำแหน่งข้อมูล OpenAPI ด้วย)
ในตัวอย่าง URL พื้นฐานคือ http://localhost:8080/
สร้างที่เก็บข้อมูลใหม่ smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
ป้อนข้อมูลตัวอย่างใน รูปแบบเส้นธรรมดา ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
) รูปแบบนี้ได้รับแรงบันดาลใจจาก InfluxDb แต่ไม่ได้ใช้ค่าที่มีชื่อ แต่ค่าตำแหน่ง นอกจากนี้ ก่อน InfluxDb การประทับเวลายูนิกซ์ในหน่วยมิลลิวินาทีจะถูกใช้เป็นเวลาเสมอ
ข้อมูลตัวอย่างต่อไปนี้แสดงข้อมูลจากการตรวจวัดเซ็นเซอร์ที่บ้าน ได้แก่ อุณหภูมิ ความชื้น ความเข้มของแสง
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 "
คุณสามารถส่งหลายบรรทัดในข้อความเดียวได้ แต่ไม่ใช่ทุกเชลล์ที่รองรับสิ่งนี้
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 อนุญาตให้ทำการสืบค้นในรูปแบบที่คล้ายกับ SQL แต่ใช้ตำแหน่งค่าแทนชื่อ ผลลัพธ์ของการสืบค้นคือผลลัพธ์ JSON
เลือกข้อมูลความชื้นจาก ห้อง 2 เก่ากว่า 12 ชั่วโมง:
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 "
ไวยากรณ์ที่สมบูรณ์สำหรับการแทรกข้อมูล - โปรโตคอลบรรทัดแบบง่าย:
<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
การวัดโดยไม่มีแท็ก:
sensors_data 12.5 1608852317000
การวัดด้วยแท็ก:
sensors_data,home/room3/esp32 12.5 1608852317000
การวัดที่มีหลายค่า:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
การวัดที่มีค่าหายไป (ใช้ NULL
สำหรับค่าที่หายไป):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
การวัดโดยไม่มีการประทับเวลา Unix - ใช้เวลาเซิร์ฟเวอร์ปัจจุบัน:
sensors_data,home/room3/esp32 12.5
ค่าหลายบรรทัด:
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
ไวยากรณ์ที่สมบูรณ์สำหรับการสืบค้นข้อมูล:
<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 }
เลือกข้อมูลทั้งหมด:
SELECT * FROM sensors_data
เลือก 5 รายการแรกจาก ห้อง 3 :
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
เลือกกลุ่มข้อมูลอุณหภูมิครั้งละ 10 นาที:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
เลือกข้อมูลความชื้นจาก ห้อง 2 :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
เลือกข้อมูลความชื้นจาก ห้อง 2 เก่ากว่า 12 ชั่วโมง:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
เลือกบันทึกล่าสุด:
SELECT * FROM sensors_data LIMIT ..1
จัดกลุ่มข้อมูลทั้งหมด:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
เลือกตามเวลาที่เป็นรูปธรรม (ใช้การประทับเวลายูนิกซ์เป็นมิลลิวินาที):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
เลือกตามเวลาที่เป็นรูปธรรม (โดยใช้เวลาที่มนุษย์อ่านได้):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m