أساسيات قواعد البيانات للأنظمة الصناعية
لماذا تحتاج قاعدة بيانات في المصنع؟
تخيّل مصنعاً فيه 200 حساس، كل حساس يسجّل قراءة كل ثانية. هذا يعني 200 × 60 × 60 × 24 = أكثر من 17 مليون قراءة يومياً. أين تخزّنها؟ كيف تبحث فيها؟ كيف تجد أن المحرك رقم 7 ارتفعت حرارته يوم الخميس الساعة 3 فجراً؟
ملفات CSV ستنهار تحت هذا الحجم. تحتاج قاعدة بيانات (Database) — نظام متخصص في تخزين واسترجاع البيانات بسرعة وأمان.
أنواع قواعد البيانات الثلاثة
قواعد البيانات العلائقية (SQL)
تنظّم البيانات في جداول (Tables) مترابطة — تماماً مثل جداول Excel لكن بقوة أكبر بكثير. كل جدول له أعمدة محددة مسبقاً (Schema).
أمثلة: PostgreSQL, MySQL, SQLite, Microsoft SQL Server
-- إنشاء جدول الآلات
CREATE TABLE machines (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
type TEXT NOT NULL,
location TEXT,
max_temp REAL DEFAULT 85.0,
installed DATE
);
-- إنشاء جدول قراءات الحساسات
CREATE TABLE sensor_readings (
id INTEGER PRIMARY KEY,
machine_id INTEGER REFERENCES machines(id),
timestamp TIMESTAMP NOT NULL,
temperature REAL,
vibration REAL,
pressure REAL
);
-- إدخال بيانات
INSERT INTO machines (name, type, location, max_temp)
VALUES ('CNC-01', 'مخرطة', 'القاعة 3', 90.0);
-- استعلام: الآلات التي تجاوزت حرارتها 85 درجة اليوم
SELECT m.name, s.temperature, s.timestamp
FROM sensor_readings s
JOIN machines m ON s.machine_id = m.id
WHERE s.temperature > 85.0
AND s.timestamp > CURRENT_DATE
ORDER BY s.temperature DESC;
نقاط القوة:
- هيكل واضح ومحدد (Schema)
- علاقات قوية بين الجداول (Foreign Keys)
- لغة SQL موحدة ومعروفة
- ضمان سلامة البيانات (ACID Transactions)
قواعد البيانات غير العلائقية (NoSQL)
تتعامل مع بيانات مرنة لا تتبع هيكلاً ثابتاً — مثل سجلات الأحداث حيث كل حدث قد يحمل بيانات مختلفة.
أنواعها:
| النوع | الوصف | مثال |
|---|---|---|
| Document | مستندات JSON مرنة | MongoDB, CouchDB |
| Key-Value | مفتاح وقيمة بسيطة | Redis, DynamoDB |
| Graph | عُقد وعلاقات | Neo4j, SurrealDB |
| Wide-Column | أعمدة ديناميكية | Cassandra, ScyllaDB |
// مثال: مستند MongoDB لحدث صناعي
{
"_id": "evt_20240315_001",
"machine_id": "CNC-01",
"timestamp": "2024-03-15T14:30:05Z",
"event_type": "alarm",
"severity": "high",
"data": {
"temperature": 92.3,
"threshold": 85.0,
"action_taken": "speed_reduced",
"operator": "أحمد محمد"
},
"tags": ["حرارة", "تجاوز", "خط_CNC"]
}
نقاط القوة:
- مرونة في الهيكل — لا تحتاج Schema مسبقاً
- تعامل ممتاز مع البيانات المتداخلة (nested)
- تتوسع أفقياً بسهولة (horizontal scaling)
- سرعة كتابة عالية
قواعد بيانات السلاسل الزمنية (Time-Series)
مصمّمة خصيصاً لبيانات تتغير مع الزمن — وهذا بالضبط ما تنتجه الحساسات. محسّنة لكتابة كميات هائلة من البيانات المختومة بالزمن.
أمثلة: InfluxDB, TimescaleDB, QuestDB
-- مثال InfluxDB: كتابة قراءة حساس
INSERT sensor_data,machine=CNC-01,location=hall3
temperature=78.5,vibration=2.3,pressure=145.0
1710500000000000000
-- استعلام: متوسط الحرارة كل 5 دقائق لآخر ساعة
SELECT MEAN(temperature)
FROM sensor_data
WHERE machine = 'CNC-01'
AND time > now() - 1h
GROUP BY time(5m)
نقاط القوة:
- سرعة كتابة فائقة (ملايين النقاط في الثانية)
- ضغط بيانات ممتاز (توفير 90%+ من المساحة)
- استعلامات زمنية مدمجة (تجميع بالساعة/اليوم/الشهر)
- حذف تلقائي للبيانات القديمة (retention policies)
مقارنة شاملة
| المعيار | SQL | NoSQL | Time-Series |
|---|---|---|---|
| الهيكل | ثابت (Schema) | مرن | ثابت مع طابع زمني |
| أفضل استخدام | بيانات مهيكلة ومترابطة | بيانات متنوعة ومرنة | بيانات حساسات وقياسات |
| سرعة الكتابة | جيدة | ممتازة | فائقة |
| الاستعلامات | SQL كامل | حسب النوع | استعلامات زمنية |
| مثال صناعي | إدارة الآلات والطلبات | سجلات الأحداث | قراءات الحساسات |
| التوسع | عمودي (vertical) | أفقي (horizontal) | أفقي |
الفهارس (Indexes): تسريع البحث
بدون فهرس، قاعدة البيانات تفحص كل صف للعثور على ما تبحث عنه. الفهرس يعمل مثل فهرس الكتاب — يُوجّهك مباشرة للمكان الصحيح.
-- بدون فهرس: يفحص كل القراءات (بطيء جداً مع الملايين)
SELECT * FROM sensor_readings
WHERE machine_id = 5 AND timestamp > '2024-03-15';
-- إنشاء فهرس مركّب
CREATE INDEX idx_machine_time
ON sensor_readings (machine_id, timestamp);
-- نفس الاستعلام الآن أسرع بمئات المرات
متى تنشئ فهرساً؟
- الأعمدة التي تبحث فيها كثيراً (
WHERE) - الأعمدة التي ترتّب بها (
ORDER BY) - الأعمدة المستخدمة في الربط (
JOIN)
تحذير: كل فهرس يبطّئ عمليات الكتابة قليلاً — لا تبالغ في عددها.
SurrealDB: قاعدة بيانات الجيل الجديد
SurrealDB قاعدة بيانات حديثة تجمع مميزات SQL و NoSQL و Graph في نظام واحد. تدعم الجداول والمستندات والعلاقات البيانية والاستعلامات في الزمن الحقيقي.
-- SurrealQL: تعريف جدول مع قيود
DEFINE TABLE machine SCHEMAFULL;
DEFINE FIELD name ON machine TYPE string;
DEFINE FIELD machine_type ON machine TYPE string;
DEFINE FIELD location ON machine TYPE string;
DEFINE FIELD max_temp ON machine TYPE float DEFAULT 85.0;
DEFINE FIELD installed ON machine TYPE datetime;
-- إنشاء سجل
CREATE machine SET
name = 'CNC-01',
machine_type = 'مخرطة',
location = 'القاعة 3',
max_temp = 90.0,
installed = '2023-06-15T00:00:00Z';
-- علاقات بيانية: الآلة تقع في قسم
RELATE machine:cnc01 -> located_in -> department:machining;
-- استعلام مع العلاقات
SELECT name, ->located_in->department.name AS dept
FROM machine
WHERE max_temp > 85.0;
مميزات SurrealDB للصناعة:
- Multi-model: علائقية + مستندات + بيانية في نظام واحد
- Real-time: اشتراكات مباشرة للتغييرات (Live Queries)
- Permissions: صلاحيات دقيقة على مستوى الحقل
- Embedded + Server: يعمل مدمجاً في التطبيق أو كخادم مستقل
تصميم قاعدة بيانات لمصنع: مثال عملي
-- الآلات
CREATE TABLE machines (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE,
type VARCHAR(30),
department VARCHAR(30),
max_temp REAL,
max_vibration REAL,
status VARCHAR(20) DEFAULT 'active'
);
-- قراءات الحساسات (مُقسّمة حسب الشهر للأداء)
CREATE TABLE readings_2024_03 (
machine_id INTEGER REFERENCES machines(id),
ts TIMESTAMP NOT NULL,
temp REAL,
vibration REAL,
pressure REAL
);
CREATE INDEX idx_readings_machine_ts
ON readings_2024_03 (machine_id, ts);
-- سجل الإنذارات
CREATE TABLE alarms (
id SERIAL PRIMARY KEY,
machine_id INTEGER REFERENCES machines(id),
triggered_at TIMESTAMP DEFAULT NOW(),
severity VARCHAR(10), -- low, medium, high, critical
parameter VARCHAR(20), -- temperature, vibration, pressure
value REAL,
threshold REAL,
acknowledged BOOLEAN DEFAULT FALSE,
acknowledged_by VARCHAR(50)
);
-- استعلام: ملخص إنذارات الأسبوع لكل آلة
SELECT
m.name,
COUNT(*) AS total_alarms,
COUNT(*) FILTER (WHERE a.severity = 'critical') AS critical,
MAX(a.value) AS worst_reading
FROM alarms a
JOIN machines m ON a.machine_id = m.id
WHERE a.triggered_at > NOW() - INTERVAL '7 days'
GROUP BY m.name
ORDER BY critical DESC, total_alarms DESC;
كيف تختار قاعدة البيانات المناسبة؟
| السؤال | الإجابة | الاختيار |
|---|---|---|
| بياناتك منظّمة ومترابطة؟ | نعم | SQL (PostgreSQL) |
| بياناتك مرنة ومتنوعة الهيكل؟ | نعم | NoSQL (MongoDB) |
| بياناتك حساسات مع طوابع زمنية؟ | نعم | Time-Series (InfluxDB) |
| تحتاج كل شيء في نظام واحد؟ | نعم | SurrealDB |
| تحتاج تخزين مؤقت سريع جداً؟ | نعم | Redis (Key-Value) |
في الواقع، معظم المصانع الذكية تستخدم أكثر من نوع — قاعدة علائقية لإدارة الآلات والطلبات، وقاعدة زمنية لبيانات الحساسات. المهم أن تختار بناءً على طبيعة بياناتك لا على ما هو شائع.