التجميع والتركيب
التجميع والتركيب
لا تعيش معظم الكائنات في نظام حقيقي بمعزل — فهي مصنوعة من أجزاء أصغر وقد تكون هذه الأجزاء بدورها مؤلفة من مكونات فرعية. يُعبّر UML عن هذه علاقات الكل بالجزء بترميزين متقاربين: التجميع والتركيب. يُرسم كلاهما كخط بمعين على طرف "الكل"، غير أن شكل المعين يحمل فارقاً جوهرياً في المعنى يؤثر مباشرة في تصميم قاعدة البيانات والكود وقواعد العمل.
فهم هذا الفرق من أعملي المهارات التي يطوّرها المحلل: إذ يُحدد ما إذا كان حذف سجل أب يجب أن يتتالى إلى الأبناء، وما إذا كانت الأجزاء مشتركة بين آباء متعددين، ومدى الترابط أو الاستقلالية بين المكونات.
استعارة المعين المشترك
يستخدم كل من التجميع والتركيب معيناً على طرف "الكل" (الأب) من خط العلاقة. يوضح المعين بصرياً أن إحدى الفئات تحتوي أو تتكون من أو تدير مجموعة من فئة أخرى. يكمن الفارق الجوهري في التبعية في دورة الحياة والانفرادية:
- التجميع (معين مجوف ◇): علاقة "يمتلك" حيث يمكن للجزء الوجود باستقلالية عن الكل. إذا أُتلف الكل بقيت الأجزاء. بل يمكن مشاركة الأجزاء بين أكثر من كل.
- التركيب (معين مملوء ◆): علاقة "يتألف من" حيث لا يستطيع الجزء الوجود باستقلالية. إذا أُتلف الكل، أُتلفت جميع أجزائه معه. يتبع الجزء في أي لحظة كلاً واحداً بالضبط.
المخطط الأول — الترميزان جنباً إلى جنب
يُظهر المخطط أدناه كلا الترميزين مع تسميات توضيحية حتى تحفظ الأشكال قبل تطبيقها على سيناريو حقيقي.
التجميع بالتفصيل: مثال القسم والموظف
لدى متجر إلكتروني أقسام (التسويق، الهندسة، اللوجستيك) وموظفون ينتمون إلى قسم. هذا سيناريو تجميع كلاسيكي:
- يمتلك
Employeeوجوداً مستقلاً: قبل إسناده إلى أي قسم فهو موجود في نظام الموارد البشرية. وبعد مغادرة القسم قد ينتقل إلى قسم آخر، أو قد تُعيد الشركة هيكلتها وتلغي قسماً مع الاحتفاظ بموظفيه. - حذف سجل قسم التسويق لا يحذف سجلات
Employee؛ يُعاد تعيين هؤلاء الموظفين أو يُضبط مفتاحهم الأجنبي على null. - في بعض المؤسسات يمكن للموظف الانتماء إلى أقسام متعددة (تجميع بمشاركة الجزء). يُجيز UML ذلك في التجميع لا في التركيب.
يُضع المعين المجوف ◇ على طرف Department (الكل) بتعددية 1، وعلى طرف Employee (الجزء) بتعددية * (صفر أو أكثر من الموظفين للقسم).
employees.department_id بـ NULL حتى يمكن لموظف الوجود بلا قسم، ويكون ON DELETE SET NULL (أو بلا تتالٍ) الافتراض الآمن.
التركيب بالتفصيل: مثال الطلب وبند الطلب
في المتجر الإلكتروني نفسه، يضع العميل Order ويحتوي كل طلب على بند أو أكثر من نوع OrderLine (كل بند يُسجّل منتجاً وكمية وسعراً). هذه علاقة تركيب لأن:
- ليس لـ
OrderLineمعنى خارج طلبه الأب. "الكمية: 2، السعر: 49.99" لا معنى له إن لم تعرف إلى أي طلب ينتمي. - عند الحذف الدائم للطلب (مثلاً تنظيف الطلبات الملغاة)، يُحذف كل
OrderLineالمرتبط به — قواعد العمل تفرضه ونموذج البيانات يُطبّقه. - لا يمكن لـ
OrderLineالانتماء إلى طلبين مختلفين في آنٍ واحد.
يقع المعين المملوء ◆ على طرف Order بتعددية 1. يحمل طرف OrderLine تعددية 1..* (يجب أن يحتوي كل طلب على بند واحد على الأقل).
order_lines.order_id NOT NULL مع ON DELETE CASCADE يُطبّق حذف البنود مع طلبها الأب.
المخطط الثاني — نظام المكتبة: كلتا العلاقتين معاً
يوفر نظام مكتبة مثالاً أثرى يستخدم العلاقتين في المخطط ذاته، وهو المعتاد في النماذج الحقيقية.
- لدى
Libraryكثير من سجلاتBook— لكن الكتب يمكن نقلها إلى فرع آخر أو بيعها؛ فهي موجودة باستقلالية عن أي مكتبة بعينها. تجميع. - يتألف
Bookمن كائناتChapter— فالفصل لا هوية له ولا معنى خارج كتابه؛ حذف سجل الكتاب يدمر سجلات فصوله كلها. تركيب. - سجل
Loanيتألف من إدخالاتLoanItem(واحدة لكل كتاب في إعارة متعددة الكتب) — لا يمكن لبنود الإعارة البقاء بعد سجل الإعارة الأب. تركيب.
قراءة مخطط المكتبة
مرّ على كل علاقة وتحقق من سؤالي دورة الحياة:
- Library ◇ — * Book (تجميع): يمكن للكتاب الوجود في كتالوج باستقلالية عن أي فرع مكتبة. عند إغلاق فرع، تُنقل كتبه لا تُدمَّر. وجود مستقل؟ نعم. مشاركة محتملة؟ نعم. النتيجة: تجميع.
- Book ◆ — 1..* Chapter (تركيب): للفصل (مثلاً "الفصل الثالث") لا هوية ولا غاية بدون كتابه. إذا حُذف سجل الكتاب حُذفت سجلات فصوله كلها. وجود مستقل؟ لا. ينتمي إلى كتاب واحد فقط؟ نعم. النتيجة: تركيب.
- Loan ◆ — 1..* LoanItem (تركيب): لبند الإعارة (كتاب محدد في معاملة إعارة محددة) لا معنى خارج معاملة الإعارة الأم. إغلاق سجل الإعارة وحذفه يجب أن يتتالى إلى بنوده. النتيجة: تركيب.
قائمة تحقق عملية للقرار
عند مواجهة علاقة كل بجزء محتملة أثناء تحليل المتطلبات، مرّ على هذه الأسئلة الأربعة بالترتيب:
- هل هذه بالفعل علاقة كل بجزء؟ إذا كانت الفئتان تعرف إحداهما الأخرى ببساطة (مثلاً Customer يضع Order)، فهذا ارتباط عادي لا تجميع ولا تركيب.
- هل يستطيع الجزء الوجود بدون الكل؟ إذا كانت الإجابة نعم — تجميع. إذا لا — فكّر في التركيب.
- هل يمكن للجزء الانتماء إلى أكثر من كل في آنٍ واحد؟ إذا نعم — تجميع (مشترك). إذا لا — اتجه نحو التركيب.
- عند تدمير الكل هل يجب تدمير الجزء معه؟ إذا نعم — تركيب. إذا لا — تجميع.
أخطاء المحللين الشائعة
Company كائنات Employee — لكن الموظفين ليسوا مُركَّبين داخل الشركة؛ فهم موجودون باستقلالية ويمكنهم المغادرة. استخدم التجميع.
خلاصة
- التجميع (معين مجوف ◇) — يمكن للجزء الوجود باستقلالية وقد يكون مشتركاً. دورة الحياة مستقلة. قاعدة البيانات: مفتاح أجنبي قابل للإفراغ، بلا تتالٍ عند الحذف.
- التركيب (معين مملوء ◆) — لا يستطيع الجزء الوجود بدون كله وينتمي إلى كل واحد بالضبط. دورة الحياة مقترنة. قاعدة البيانات: مفتاح أجنبي غير قابل للإفراغ مع تتالٍ عند الحذف.
- يقع المعين دائماً على طرف الكل (الأب) من الخط.
- تسميات التعددية لا تزال تُطبَّق: يحمل طرف الكل عادةً
1أو0..1؛ ويحمل طرف الجزء*أو1..*أو عدداً محدداً. - طرح سؤالي دورة الحياة — "هل يمكن للجزء الوجود وحده؟" و"هل يمكنه الانتماء إلى أكثر من كل؟" — يوجّه بشكل موثوق نحو الاختيار الصحيح بين الترميزين.