حل علاقات كثير بكثير
حل علاقات كثير بكثير
من أكثر الأخطاء شيوعاً لدى المحللين المبتدئين هو ترك علاقة "كثير بكثير" كما هي في نموذج البيانات المادي. لا تستطيع قواعد البيانات العلائقية تنفيذ هذا النوع من العلاقات مباشرةً، بل تحتاج إلى جدول وسيط يقع بين الكيانين. تُسمى هذه التقنية حل العلاقة، ويُعرف الجدول الذي تضيفه بـالكيان الوسيط (أو كيان الربط أو جدول الجسر).
لماذا لا يمكن إبقاء علاقة كثير بكثير دون حل؟
تخيّل متجراً إلكترونياً لبيع الكتب: يمكن للعميل الواحد أن يُنشئ طلبات شراء متعددة، وكل طلب قد يحتوي على كتب متعددة. لو رسمتَ خطاً مباشراً بين Order وBook، لن تتمكن من الإجابة على أسئلة بسيطة مثل: "كم نسخة من هذا الكتاب كانت في ذلك الطلب بالذات؟" أو "ما الخصم المطبّق على هذا الصنف؟" لأنه لا يوجد عمود لتخزين هذه البيانات، ولا صف لاحتوائها.
قبل الحل: علاقة كثير بكثير الخام
يوضح المخطط أدناه سيناريو عيادة طبية قبل حل العلاقة. يمكن للمريض Patient حجز مواعيد مع عدة أطباء Doctor، كما يمكن للطبيب استقبال مرضى متعددين. تُشير رموز "أقدام الغراب" على كلا الطرفين إلى أن العلاقة من نوع كثير بكثير (M:N).
بعد الحل: إدخال الكيان الوسيط
لحل العلاقة، نُزيل خط M:N ونُدخل كياناً جديداً — Appointment — يقع بين Patient وDoctor. يحمل الكيان الوسيط:
- مفتاح خارجي يربطه بالمريض (
patientID) — أحد طرفي الزوج الأصلي. - مفتاح خارجي يربطه بالطبيب (
doctorID) — الطرف الآخر. - مفتاح أساسي مركّب مكوّن من كلا المفتاحين الخارجيين (أو مفتاح بديل مع قيد تفرّد على المفتاحين).
- أي سمات تخص العلاقة ذاتها — في هذا المثال:
appointmentDateوstartTimeوstatusوnotes. هذه السمات لا معنى لها منفردةً في جدول المريض أو الطبيب.
مثال ثانٍ: بنود الطلبات في متجر إلكتروني
في متجر إلكتروني، توجد علاقة M:N خام بين Order وProduct. حلّها يُنشئ كيان OrderItem الوسيط الذي يحمل سمات تخص هذا التركيب تحديداً: quantity وسعر الوحدة unitPrice وقت الشراء (الذي قد يختلف عن السعر الحالي للمنتج).
بدون OrderItem، أين ستُخزَّن quantity؟ لا يمكن وضعها في Order لأن الطلب يغطي منتجات متعددة، ولا في Product لأن المنتج يظهر في طلبات كثيرة. الكيان الوسيط هو المكان المنطقي الوحيد لها.
قائمة التحقق: متى تحتاج إلى كيان وسيط؟
- كلا علامتَي الكثرة موجودتان — رمز "أقدام الغراب" على طرفَي خط العلاقة هو الإشارة الفورية.
- توجد سمات تصف الزوج لا أيًّا من الكيانين منفرداً — الكمية وتاريخ الحجز ودور الموظف في المشروع أمثلة كلاسيكية.
- تحتاج إلى تسجيل توقيتات أو ترتيب للعلاقة — متى زار المريض هذا الطبيب لأول مرة؟ متى استُعير الكتاب؟
- للعلاقة ذاتها دورة حياة — الموعد قد يكون مؤكداً أو ملغى أو مكتملاً؛ الإعارة قد تكون نشطة أو مُعادة أو متأخرة.
مثال المكتبة الجامعية: الطالب يستعير كتاباً
تُجسّد مكتبة جامعية نموذجاً مثالياً للكيان الوسيط ذي دورة حياة واضحة. يمكن للطالب Student استعارة كتب Book متعددة، ويمكن لنسخة الكتاب أن تُستعار من طلاب متعددين عبر الزمن. الكيان الوسيط Loan يُسجّل borrowedDate وdueDate وreturnedDate (قابل للقيمة الفارغة) وfineAmount. هذه السمات جميعها لا معنى لها بدون ربط الطالب بالكتاب معاً.
studentID + bookCopyID + borrowedDate إذا كان بالإمكان استعارة الكتاب ذاته مرتين). فرق أخرى تفضّل مفتاحاً بديلاً loanID مع قيد تفرّد على التركيبة الطبيعية. كلا الأسلوبين صحيح — وثّق اختيارك في قاموس البيانات.
خلاصة
حل علاقات كثير بكثير هو أحد أكثر الخطوات أثراً في تحويل ERD المنطقي إلى نموذج مادي. كل خط M:N يتحوّل إلى كيان وسيط يحمل مفتاحَين خارجيَّين وأي سمات تخص الارتباط. كثيراً ما يكتسب الكيان الوسيط اسماً تجارياً ذا معنى — Appointment، OrderItem، Loan، Enrollment — لأنه يمثّل مفهوماً حقيقياً في المجال. إتقان هذا التحويل ضروري قبل الانتقال إلى التطبيع.