قاعدة بيانات TimeSeries أخرى هي قاعدة بيانات سلاسل زمنية تجريبية مستوحاة من InfluxDb و RavenDB .
يتم تنفيذ YATsDb في .NET النقي و C# الحديث بأداء رائع (حوالي 30 ألف إدخال في الثانية على وحدة المعالجة المركزية Intel i7-8550U، و1.80 جيجا هرتز، وذاكرة الوصول العشوائي (RAM) سعة 24 جيجابايت، وSSD - يتم إدراج الصفوف واحدًا تلو الآخر).
كنت بحاجة إلى قاعدة بيانات سلاسل زمنية لمشاريع إنترنت الأشياء المنزلية، ولكن استخدام InfluxDb سيكون مملًا. استغرق تنفيذ النموذج الأولي، الذي يعرف كيفية إدخال البيانات والاستعلام، 12 ساعة فقط.
YATsDb هو تطبيق كامل لقاعدة البيانات مع واجهة المستخدم الرسومية وتعريفات ووظائف OpenAPI. يتطلب تشغيل .NET 8.
YATsDb.Lite هو إصدار مجمع من AOT مع وظيفة قاعدة بيانات السلاسل الزمنية الأساسية. ليس لديها أي تبعيات على الأنظمة المستهدفة.
الثنائي الناتج صغير نسبيًا <15 ميجابايت .
ما يلي هو مثال لاستخدام 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 ، يتم دائمًا استخدام الطابع الزمني لنظام التشغيل Unix بالمللي ثانية باعتباره الوقت.
تمثل بيانات العينة التالية بيانات من القياس المنزلي لأجهزة الاستشعار - درجة الحرارة والرطوبة وشدة الضوء.
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.
حدد بيانات الرطوبة من Room2 الأقدم من 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 سجلات من Room3 :
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
حدد مجموعة بيانات درجة الحرارة بمقدار 10 دقائق:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
حدد بيانات الرطوبة من Room2 :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
حدد بيانات الرطوبة من Room2 الأقدم من 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
حدد حسب الوقت المحدد (باستخدام الطابع الزمني لنظام التشغيل Unix بالمللي ثانية):
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