مقالة

شرح علاقات قواعد البيانات

Feb 28, 2020 5,719
شرح علاقات قواعد البيانات

سيساعدك هذا المقال على فهم مفهوم علاقات قواعد البيانات. إن فهم علاقات قواعد البيانات يعينك على اتخاذ قرارات أسرع أثناء تصميم قاعدة البيانات أو عند التخطيط لتطبيقٍ ما.

سنغطي العلاقات التالية

  1. واحد لواحد (One to One)
  2. واحد لمتعدد – متعدد لواحد (One to Many - Many to One)
  3. متعدد لمتعدد (Many to Many)
  4. العلاقات متعددة الأشكال (Polymorphic): ‏Morph to Many & Morph to One

ولأغراض هذا المقال سنفترض أننا سنبني مدوّنة بسيطة. ولزيادة التبسيط سنستخدم إطار Laravel كمرجع للتسمية وإعطاء مزيد من التفاصيل.

ما هي النماذج الأساسية لأي مدوّنة؟

  • التصنيفات (categories)
  • المقالات (articles)
  • الوسوم (tags)
  • التعليقات (comments)
  • ولنُضِف أيضاً معرض صور (photo gallery).

أساس جداولنا:

The base of our tables


نلاحظ أننا لا نستطيع وصل أي من هذه الجداول ببعضها لأن أيّاً منها لا يملك حقول علاقة.

فلنبدأ بإصلاح الجداول!

لنبدأ بأول جدول: جدول التصنيفات

لنقل إن كل تصنيف يمكن أن يحوي تصنيفات فرعية. هذا يُمثِّل علاقة (واحد لمتعدد) ببساطة. كيف نحقق ذلك؟ الحل سهل: سنضيف الحقل parent_id إلى جدول categories.

the category table


والآن، لنفترض أن كل مقال ينتمي إلى مؤلف واحد، وبالطبع كل مؤلف لديه عدة مقالات. هذا يُعرّفنا بعلاقة (متعدد لواحد) أو (واحد لمتعدد العكسية). لتحقيق ذلك سنضيف الحقل author_id إلى جدول المقالات.

article table


ولأغراض هذا المقال أيضاً لنفترض أن لكل مؤلف عنواناً واحداً. إذن، لنضف جدول العناوين:

address table


لربط سجلات هذا الجدول بالمؤلف سنستخدم علاقة (واحد لواحد). سنضيف عموداً إلى جدول addresses باسم author_id.

fix adresses table


الأمور بدأت تتعقّد!

قد تنتمي مقالاتنا أحياناً لأكثر من تصنيف واحد. لهذه الحالة نستخدم علاقة (متعدد لمتعدد) والتي تعني أن كل نموذج (Model 1) يمكن أن يحتوي على عدة عناصر من نموذج آخر (Model 2) والعكس صحيح. لتطبيق هذا النوع من العلاقات نحتاج جدولاً وسيطاً يصل الجدولين معاً. لننشئ الجدول الثالث باسم يضم الاسمين المفردين للجدولين:

article_category Table


العلاقات متعددة الأشكال (Polymorphic)

وهي النوع الأكثر تعقيداً من علاقات قواعد البيانات، لكنها مهمة جداً، إذ بدونها قد نكرّر الجداول مما يكبّر قاعدة البيانات—وهو ما علينا تجنّبه قدر الإمكان عند التصميم.

بالنسبة للتعليقات، لنفترض أننا نريد تمكين المستخدم من التعليق على صور المعرض والمقالات. هنا نستخدم علاقة (morph to one) والتي تربط كل سجل من نموذج واحد بسجل واحد من عدة نماذج مختلفة. لتطبيقها لا نحتاج جدولاً منفصلاً؛ بل نضيف عمودين إلى جدول comments:

comments table


وأخيراً جدول الوسوم. نريد كتابة وسوم مرتبطة بكلٍّ من المقالات وصور المعرض. لنقل إن لدينا الوسم #web، وعند استدعائه نريد جلب كل المقالات والصور الموسومة به. لتحقيق ذلك نستخدم علاقة (morph to many)؛ أي يمكن ربط كل نموذج بأكثر من نموذج آخر. نحتاج هنا جدولاً وسيطاً جديداً ولنسمّه tagable ويحوي الأعمدة التالية:

This table has those columns

هنا يشير tagable_id إلى معرّف سجل النموذج المرتبط (مثلاً: معرّف المقال)، بينما يشير tagable_type إلى نوع النموذج المرتبط (مثلاً: Article).

خلاصة

  • واحد لواحد: لربط سجل واحد من نموذج بسجل واحد من نموذج آخر (أقل شيوعاً إلا إذا كان الجدول الآخر يحوي أعمدة كثيرة).
  • واحد لمتعدد: لربط سجل واحد من نموذج بعدة سجلات من نموذج آخر.
  • متعدد لمتعدد: لربط عدة سجلات من نموذج بعدة سجلات من نموذج آخر—ويحتاج جدولاً وسيطاً.
  • العلاقات متعددة الأشكال: لربط نموذج واحد بعدة أنواع من النماذج—وغالباً تحتاج جدولاً وسيطاً.

المراجع:

  1. Eloquent: Relationships من توثيق لارافيل link
  2. SQL for Beginners: Part 3 - Database Relationships بقلم Burak Guzel link
  3. The 3 Types of Relationships in Database Design بقلم IAN link
أحمد يوسف
أحمد يوسف

بصفتي مطورًا متكاملًا (Full-Stack) أحمل درجة الماجستير في الهندسة الكهربائية وهندسة الحاسوب، فأنا شغوف جدًا بتصميم وتطوير الويب. أستمتع باستكشاف التقنيات الحديثة ومشاركة الأفكار حول إنشاء تجارب رقمية تتمحور حول المستخدم في هذا المجال المثير.

مقالات مرتبطة

قد يعجبك أيضًا

عرض جميع المقالات
تأمين قنوات WebSocket في بيئة التطوير المحلية: دليل باستخدام Soketi وLaravel Valet cover

تأمين قنوات WebSocket في بيئة التطوير المحلية: دليل باستخدام Soketi وLaravel Valet

في هذا الدليل سنوضّح كيفية إعداد القنوات الخاصة باستخدام Laravel Valet وSoketi وحل مشكلات اتصال WSS في البيئة المحلية.

اقرأ المقال
كيفية إنشاء خريطة موقع باستخدام Laravel cover

كيفية إنشاء خريطة موقع باستخدام Laravel

إضافة خريطة موقع (Sitemap) إلى تطبيق Laravel أمر مهم لتواصل موقعك مع محرّكات البحث وإخبارها بكل الروابط وتحسين SEO.

اقرأ المقال
ما هو نظام EDGE الخلوي؟ cover

ما هو نظام EDGE الخلوي؟

EDGE ‏(Enhanced GPRS) نظام بيانات يُستخدم على شبكات GSM. يوفّر سرعة أكبر بثلاث مرات من نظام GPRS.

اقرأ المقال