لنتفق على أن قواعد البيانات أو البيانات اليوم هي أساس البرمجيات. تخيل أنك بنيت أفضل برنامج في العالم بأفضل التقنيات الممكنة التي تعلمتها جميعها، ثم في النهاية فتحت هذا التطبيق ووجدته فارغًا لا يحتوي على أي شيء. بالتأكيد عندما تعرضه على أي مستخدم، سيقول لك إن التطبيق ليس له قيمة بدون بيانات. لذلك، من المهم جدًا اليوم أن تستوعب أنواع قواعد البيانات وطرق تخزينها، وكيفية التعامل مع هذه البيانات من أجل عرضها للمستخدم بأفضل طريقة ممكنة، لأن هذا في النهاية هو هدفك من التطبيق الذي تبنيه.
دعونا نتحدث عن أنواع قواعد البيانات التي نستخدمها اليوم في عملنا كمهندسي برمجيات.
الأقسام الرئيسية لقواعد البيانات
هناك قسمان كبيران تندرج تحتهما كل أنواع قواعد البيانات اليوم، وهي محركات قواعد البيانات إما أن تكون قواعد بيانات علائقية (Relational) أو قواعد بيانات غير علائقية (Non-Relational).
- قواعد البيانات العلائقية (Relational Database): هي ببساطة أنواع من قواعد البيانات التي تنشئ علاقات بين البيانات، بغض النظر عن نوع هذه العلاقات. دائمًا ما تكون البيانات مرتبطة بالبيانات التي تليها أو البيانات المحيطة بها بعلاقة ما.
- قواعد البيانات غير العلائقية (Non-Relational Database): في معظم الأحيان، لا توجد علاقات قوية بين البيانات؛ أي تكون البيانات كلها مستقلة ولكنك تريد تخزينها معًا في مكان واحد. غالبًا، البيان الذي تضعه لا علاقة له بالبيان الآخر. تمنحك قواعد البيانات غير العلائقية إمكانية وصف علاقة، لكنها ليست علاقة محكمة وليس لها قواعد صارمة، وهو ما سنفهمه لاحقًا.
أولاً: قواعد البيانات العلائقية (Relational Databases)
لنبدأ بأنواع قواعد البيانات العلائقية، لأنها غالبًا المستخدمة منذ زمن بعيد، حيث بدأت في الظهور في السبعينيات وتُستخدم حتى يومنا هذا في معظم التطبيقات.
1. المخطط القائم على الجداول (Table-Based Schema)
النوع الأول في قواعد البيانات العلائقية هو المخطط القائم على الجداول، حيث يكون لدي جداول (Tables) وأقوم بإنشاء علاقات بينها. هذا النوع مناسب لأي بيانات يمكن تخزينها في جداول.
أنواع العلاقات:
- علاقة واحد إلى متعدد (One-to-Many): على سبيل المثال، علاقة الطالب بدرجاته. الطالب الواحد لديه درجات في عدة مواد.
- علاقة متعدد إلى واحد (Many-to-One): وهي عكس العلاقة السابقة. إذا نظرت من منظور الدرجات، فإن درجة أو عدة درجات تنتمي إلى طالب واحد.
- علاقة متعدد إلى متعدد (Many-to-Many): مثال على ذلك علاقة الطالب بالمقررات الدراسية. يمكن للطالب أن يأخذ أكثر من مقرر، والمقرر الدراسي نفسه يمكن أن يسجل فيه أكثر من طالب. في هذه الحالة، لا يمكن تمثيل العلاقة ببساطة، بل نحتاج إلى جدول ثالث وسيط لربط الجدولين.
ملاحظة هامة: عند التعامل مع الجداول، ضع دائمًا المفتاح الأجنبي (Foreign Key) عند جانب “المتعدد” (Many) في العلاقة. في مثال الطالب والدرجات، ستضع المفتاح الأجنبي في جدول الدرجات. أما في حالة علاقة “متعدد إلى متعدد” بين الطالب والمقررات، فسيحتوي الجدول الوسيط على مفتاحين أجنبيين: واحد للطالب والآخر للمقرر.
أشهر المحركات: من أشهر الأمثلة على هذا النوع، والتي تُعرف أيضًا بالمخططات القائمة على المعاملات (ACID Transactions)، هي محركات مثل:
- MySQL
- PostgreSQL
- Oracle
- Microsoft SQL Server
2. قواعد بيانات الرسم البياني (Graph Database)
هذا النوع ظهر حديثًا في بداية الألفية، حوالي عام 2007-2008، وبدأ في الانتشار. يُستخدم في العلاقات المعقدة بين البيانات. فكرته ببساطة هي أنك بدلًا من تخزين البيانات في جداول، تقوم بإنشاء “عُقد” (Nodes).
تخيل أن العقدة (Node) تمثل الطالب. لكن هذه المرة، لا تقتصر بيانات الطالب على الدرجات والمقررات فقط، بل يمكنك إضافة علاقات معقدة جدًا:
- الطالب لديه أب وأم.
- يدرّسه مدرس معين.
- يحب أشياء معينة (هوايات).
المحور هنا هو العقدة التي تحمل البيان، والحواف (Edges) التي تربطها هي التي تمثل العلاقات. يمكنك وصف العلاقة بلغة بسيطة، كأن تقول:
الطالب -> [يحب] -> هواية معينة
الطالب -> [يأكل] -> طعام معين
الطالب -> [يلعب مع] -> شخص معين
أفضل مثال: تُعد وسائل التواصل الاجتماعي أفضل مثال على استخدام قواعد بيانات الرسم البياني. ملفك الشخصي هو عقدة، ولديك أصدقاء (علاقة)، وأصدقاء الأصدقاء (علاقة متعدية)، ولديك منشورات، وكلها مرتبطة ببعضها في شبكة معقدة من العلاقات متعددة المستويات.
استخدامات شائعة:
- محركات التوصية (Recommendation Engines): عندما تقترح عليك تطبيقات التسوق منتجات عند الدفع، فهي تستخدم بياناتك (عمرك، طلباتك السابقة) وبيانات المستخدمين الآخرين المشابهين لك لإنشاء توصيات دقيقة عبر ربط كل هذه العلاقات في رسم بياني.
أشهر المحركات:
- Neo4j هو من أشهر المحركات التي يمكنك تعلمها واستخدامها اليوم.
ثانيًا: قواعد البيانات غير العلائقية (Non-Relational / NoSQL)
هناك اعتقاد خاطئ شائع بأن قواعد البيانات غير العلائقية، نظرًا لعدم وجود علاقات صارمة بين بياناتها، هي نوع واحد يتم فيه إلقاء البيانات كيفما اتفق. في الحقيقة، هي أنواع متعددة ولكل منها استخداماته وتطبيقاته العملية.
1. قواعد البيانات القائمة على المستندات (Document-Based)
تتكون من مجموعة من المستندات (Documents). تخيل أن لديك أرشيف مستشفى؛ كل ملف مريض هو مستند قائم بذاته ومحفوظ في رف معين. لا توجد علاقة مباشرة بين ملف مريض وملف مريض آخر.
بنفس الطريقة، في هذا النوع من قواعد البيانات، يكون لديك مستندات بصيغة JSON تخزن فيها البيانات بشكل متداخل. مثال: يمكنك تخزين طلب طعام كمستند واحد يحتوي على كل شيء:
{
"orderId": "12345",
"customerName": "أحمد علي",
"items": [
{ "name": "بيتزا", "quantity": 1 },
{ "name": "سلطة", "quantity": 1 }
],
"paymentDetails": {
"method": "Credit Card",
"amount": 150
},
"deliveryAddress": {
"street": "شارع 123",
"city": "الرياض"
}
}
الميزة هنا أنك لست مقيدًا بمخطط (Schema) صارم. إذا كان هناك طلب آخر لا يحتوي على كل هذه التفاصيل، فلا مشكلة.
أشهر المحركات:
- MongoDB: هو المحرك الأكثر شهرة اليوم، وهو جزء أساسي من حزمة MERN Stack.
- Firebase Firestore: يعمل بنفس الطريقة، حيث يخزن البيانات كمستندات JSON.
2. محركات البحث (Search Engines)
هذا النوع مخصص لتخزين توصيف للبيانات بهدف استخدامها في البحث النصي الكامل (Full-Text Search). بدلاً من البحث في كل حقل داخل مستند JSON، يقوم محرك البحث بإنشاء فهرس (Index) للكلمات الرئيسية (Keywords) ويحدد في أي مستند توجد. هذا يجعل البحث سريعًا وفعالًا، خاصة مع البيانات التي يتم البحث عنها بكثرة مثل الأخبار المتداولة أو الكلمات الرائجة.
أشهر المحركات:
- Elasticsearch: هو الرائد في هذا المجال.
- Atlas Search: هو محرك بحث مدمج في MongoDB Atlas، يربط بين قاعدة بيانات المستندات الخاصة بك وفهرس البحث في مكان واحد.
3. قواعد بيانات المفتاح-القيمة (Key-Value)
هي من أبسط أنواع مخازن البيانات. تقوم بإنشاء مفتاح (Key) وتحدد القيمة (Value) المقابلة له.
"name": "يحيى"
الاستخدامات الرئيسية:
- التخزين المؤقت (Caching): بدلاً من جلب البيانات المستخدمة بكثرة من قاعدة البيانات الرئيسية في كل مرة، يتم تخزينها في الذاكرة (In-Memory) كـ “مفتاح-قيمة” للوصول السريع إليها.
- قوائم الانتظار (Queues): يمكن استخدامها كقائمة انتظار بسيطة عن طريق وضع البيانات المراد معالجتها في القيمة. تدعم نموذج النشر والاشتراك (Pub/Sub).
مشكلة: بما أن البيانات تُخزن في الذاكرة، فإنها تُفقد إذا تم إعادة تشغيل الخادم.
أشهر المحركات:
- Redis: هو أشهر محرك لهذا النوع من التخزين.
4. قواعد البيانات ذات الأعمدة الواسعة (Wide-Column)
فكرتها تشبه “المفتاح-القيمة”، لكن القيمة (Value) هنا ليست مجرد نص بسيط، بل هي مجموعة من الأعمدة (Columns). هذا يسمح للمفتاح الواحد بالإشارة إلى بيانات مخزنة في عدة أعمدة.
مثال:
يمكن أن يشير مفتاح واحد إلى شخص، وتكون القيمة هي أعمدة متعددة مثل: الاسم
، العمر
، العنوان
.
الميزة الأساسية: هذا النوع مصمم لعمليات الكتابة الكثيفة والسريعة (High-Write Intensity). إذا كان تطبيقك يقرأ بيانات من مكان ويحتاج إلى كتابتها بسرعة في قاعدة بيانات، فهذا هو الخيار الأمثل.
العيب: بما أنها مُحسَّنة للكتابة، فهي ليست الخيار الأفضل لعمليات القراءة الكثيفة (High-Read)، حيث قد تكون القراءة بطيئة.
الاستخدام: تُستخدم بكثرة في مجالات هندسة البيانات وتحليلها (Data Engineering & Analytics)، خاصة مع البيانات التاريخية والمتسلسلة زمنيًا.
أشهر المحركات:
- Cassandra: هو المحرك المستهدف لهذا النوع من العمليات.
- DynamoDB: خدمة تقدمها Amazon Web Services (AWS) وتوفر نفس الوظيفة.
النهج الهجين: قواعد البيانات متعددة النماذج (Multi-Model)
اليوم، لم يعد نمط البيانات موحدًا وبسيطًا. مع الكم الهائل من المعلومات المتاحة، أصبح من الصعب تخزين كل شيء في نموذج علائقي فقط. لذلك، لا يقتصر المطورون على استخدام نوع واحد فقط، بل يستخدمون ما يسمى بالنموذج المتعدد (Multi-Model) أو الهجين (Hybrid).
- مثال عملي:
- يمكن استخدام قاعدة بيانات غير علائقية (مثل MongoDB) لتخزين بيانات غير مهيكلة مثل سجلات المستخدمين (Logs) أو بيانات الخرائط.
- وفي نفس النظام، يمكن استخدام قاعدة بيانات علائقية (مثل PostgreSQL) لتخزين بيانات تتطلب علاقات صارمة، مثل علاقة المتجر بصاحبه والمنتجات الموجودة فيه.
تظهر اليوم محركات جديدة تحاول دمج النموذجين في محرك واحد، مثل Fauna، لكنها لا تزال تجريبية وغير مستقرة تمامًا. النهج الأكثر شيوعًا في الشركات الكبرى هو بناء النظام باستخدام الخدمات المصغرة (Microservices)، حيث تستخدم كل خدمة قاعدة البيانات الأنسب لاحتياجاتها.