ما هي الطريقة الأكثر فعالية لتخزين القياسات مع عدد متغير من الحقول في قاعدة البيانات؟

StackOverflow https://stackoverflow.com/questions/1629458

  •  06-07-2019
  •  | 
  •  

سؤال

لدينا نظام لجمع البيانات يجمع قياسات من أجهزة الاستشعار البيئية التي تقيس سرعة المياه التي تتدفق عبر نهر أو قناة. يولد كل قياس عددًا ثابتًا من القيم (على سبيل المثال التاريخ ، الوقت ، درجة الحرارة ، الضغط وما إلى ذلك) بالإضافة إلى قائمة من قيم السرعة.
في الأصل ، قدمت المستشعرات ثلاث قيم سرعة ، لذا قمت ببساطة بتخزين كل قيمة في عمود خاص بها من جدول واحد في قاعدة بيانات Firebird. في وقت لاحق تم تقديم المستشعر الذي يمكن أن يخرج إلى تسع قيم السرعة ، لذلك أضفت بسيطة ستة أعمدة أخرى. على الرغم من أن معظم أجهزة الاستشعار تستخدم أقل من 9 قيم ، إلا أنني أعتقد أنها لن تكون مشكلة إذا كانت معظم الأعمدة تحتوي فقط على الأصفار.
لكنني الآن أواجه جيلًا جديدًا يمكنه إخراج أي شيء من 1 إلى 256 قيمًا وأفترض أنه لن يكون فعالًا للغاية لإضافة 247 عمودًا آخر ، خاصة وأن معظم القياسات ستظل فقط تحتوي على 3 إلى 9 قيم.
نظرًا لأن القياسات يتم جمعها كل 10 دقائق ، وتحتوي قاعدة البيانات على جميع البيانات من 30 إلى 50 مستشعرًا ، فإن إجمالي كمية البيانات كبيرة جدًا بعد بضع سنوات ، ومع ذلك يجب أن يكون من الممكن إنشاء نظرة عامة/رسومات بيانية لأي فترة زمنية عشوائية.

إذن ما هي الطريقة الأكثر فعالية لتخزين قائمة القيم المتغيرة؟
نظرًا لأن كل سجل يحتوي على معرف فريد خاص به ، أفترض أنه يمكنني فقط تخزين جميع قيم السرعة في جدول منفصل ، كل قيمة مصممة مع معرف السجل الخاص به. لديّ شعور بأن هذا لن يكون فعالًا للغاية وأنه سيكون بطيئًا جدًا بعد ذلك.

هل كانت مفيدة؟

المحلول

يمكن لقواعد البيانات التعامل مع كميات كبيرة من البيانات في جدول إذا كنت تستخدم فهارس فعالة. حتى تتمكن من استخدام بنية الجدول هذا:

create table measurements (
     id,
     seq integer, -- between 1 and 256
     ts timestamp, -- Timestamp of the measurement
     value decimal(...)
)

إنشاء فهرس على id, id, seq و ts. سيتيح لك ذلك البحث بكفاءة من خلال البيانات. إذا كنت لا تثق في قاعدة البيانات الخاصة بك ، فما عليك سوى إدراج بضعة ملايين صفات وقم بتشغيل اثنين من الاختيار لمعرفة مدى نجاحها.

للمقارنة: لدي قاعدة بيانات Oracle هنا مع 112 مليون صف ويمكنني اختيار سجل حسب الطابع الزمني أو المعرف ضمن 120 مللي ثانية (0.12s)

نصائح أخرى

يمكنك حفظ البيانات المسلسل في حقل نص ، على سبيل المثال ترميز JSON القياسات على النحو التالي:

[<velocity-value-1>, <velocity-value-2>, ...]

ثم ، في الكود الخاص بك ، تخلص من القيم بعد الاستعلام.

يجب أن يعمل هذا بشكل جيد إذا قمت فقط بتصفية استفساراتك من خلال الحقول الأخرى ، وليس بالقيم المحفوظة. إذا قمت بالتصفية بالقيم ، فاستخدمها في WHERE ستكون الجمل كابوسًا.

سأذهب مع طاولة ثانية:

table measurements (Id, DateTime, Temperature, Pressure)
table velocity (Id, MeasurementId, Sequence, Value)

Velocity.MeasurementId المراجع Measurements.Id.
Velocity.Sequence هو فهرس قيمة السرعة لهذا القياس (1-256).

قم بملء هذه الجداول بالبيانات بالقرب من العالم الحقيقي قدر الإمكان واختبار عبارات SQL للعثور على أفضل الفهارس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top