
سيساعدك هذا المقال على فهم مفهوم علاقات قواعد البيانات. إن فهم علاقات قواعد البيانات يعينك على اتخاذ قرارات أسرع أثناء تصميم قاعدة البيانات أو عند التخطيط لتطبيقٍ ما.
سنغطي العلاقات التالية
- واحد لواحد (One to One)
- واحد لمتعدد – متعدد لواحد (One to Many - Many to One)
- متعدد لمتعدد (Many to Many)
- العلاقات متعددة الأشكال (Polymorphic): Morph to Many & Morph to One
ولأغراض هذا المقال سنفترض أننا سنبني مدوّنة بسيطة. ولزيادة التبسيط سنستخدم إطار Laravel كمرجع للتسمية وإعطاء مزيد من التفاصيل.
ما هي النماذج الأساسية لأي مدوّنة؟
- التصنيفات (categories)
- المقالات (articles)
- الوسوم (tags)
- التعليقات (comments)
- ولنُضِف أيضاً معرض صور (photo gallery).
أساس جداولنا:
نلاحظ أننا لا نستطيع وصل أي من هذه الجداول ببعضها لأن أيّاً منها لا يملك حقول علاقة.
فلنبدأ بإصلاح الجداول!
لنبدأ بأول جدول: جدول التصنيفات
لنقل إن كل تصنيف يمكن أن يحوي تصنيفات فرعية. هذا يُمثِّل علاقة (واحد لمتعدد) ببساطة. كيف نحقق ذلك؟ الحل سهل: سنضيف الحقل parent_id
إلى جدول categories
.
والآن، لنفترض أن كل مقال ينتمي إلى مؤلف واحد، وبالطبع كل مؤلف لديه عدة مقالات. هذا يُعرّفنا بعلاقة (متعدد لواحد) أو (واحد لمتعدد العكسية). لتحقيق ذلك سنضيف الحقل author_id
إلى جدول المقالات.
ولأغراض هذا المقال أيضاً لنفترض أن لكل مؤلف عنواناً واحداً. إذن، لنضف جدول العناوين:
لربط سجلات هذا الجدول بالمؤلف سنستخدم علاقة (واحد لواحد). سنضيف عموداً إلى جدول addresses
باسم author_id
.
الأمور بدأت تتعقّد!
قد تنتمي مقالاتنا أحياناً لأكثر من تصنيف واحد. لهذه الحالة نستخدم علاقة (متعدد لمتعدد) والتي تعني أن كل نموذج (Model 1) يمكن أن يحتوي على عدة عناصر من نموذج آخر (Model 2) والعكس صحيح. لتطبيق هذا النوع من العلاقات نحتاج جدولاً وسيطاً يصل الجدولين معاً. لننشئ الجدول الثالث باسم يضم الاسمين المفردين للجدولين:
العلاقات متعددة الأشكال (Polymorphic)
وهي النوع الأكثر تعقيداً من علاقات قواعد البيانات، لكنها مهمة جداً، إذ بدونها قد نكرّر الجداول مما يكبّر قاعدة البيانات—وهو ما علينا تجنّبه قدر الإمكان عند التصميم.
بالنسبة للتعليقات، لنفترض أننا نريد تمكين المستخدم من التعليق على صور المعرض والمقالات. هنا نستخدم علاقة (morph to one) والتي تربط كل سجل من نموذج واحد بسجل واحد من عدة نماذج مختلفة. لتطبيقها لا نحتاج جدولاً منفصلاً؛ بل نضيف عمودين إلى جدول comments
:
وأخيراً جدول الوسوم. نريد كتابة وسوم مرتبطة بكلٍّ من المقالات وصور المعرض. لنقل إن لدينا الوسم #web، وعند استدعائه نريد جلب كل المقالات والصور الموسومة به. لتحقيق ذلك نستخدم علاقة (morph to many)؛ أي يمكن ربط كل نموذج بأكثر من نموذج آخر. نحتاج هنا جدولاً وسيطاً جديداً ولنسمّه tagable
ويحوي الأعمدة التالية:
هنا يشير tagable_id
إلى معرّف سجل النموذج المرتبط (مثلاً: معرّف المقال)، بينما يشير tagable_type
إلى نوع النموذج المرتبط (مثلاً: Article).
خلاصة
- واحد لواحد: لربط سجل واحد من نموذج بسجل واحد من نموذج آخر (أقل شيوعاً إلا إذا كان الجدول الآخر يحوي أعمدة كثيرة).
- واحد لمتعدد: لربط سجل واحد من نموذج بعدة سجلات من نموذج آخر.
- متعدد لمتعدد: لربط عدة سجلات من نموذج بعدة سجلات من نموذج آخر—ويحتاج جدولاً وسيطاً.
- العلاقات متعددة الأشكال: لربط نموذج واحد بعدة أنواع من النماذج—وغالباً تحتاج جدولاً وسيطاً.
المراجع: