في هذا الدرس 6تصفّح المواضيع
إن تكديس بيانات العملاء مع طلباتهم وتفاصيل المنتجات داخل جدول مسطح واحد ضخم (أشبه بملف جدول بيانات تقليدي) يؤدي إلى مشاكل هندسية خطيرة:
- التكرار المهدر للبيانات: يتكرر اسم العميل وبريده وعنوانه مع كل طلب جديد يشتريه.
- تضارب التحديثات: عند تغيير رقم هاتف العميل في بعض الصفوف ونسيان أخرى، تتلف موثوقية البيانات.
- الفصل العلائقي بالكيانات: عبر تقسيم كل كيان مستقل (
customers،orders،products) في جدول InnoDB خاص به وربطها عبر المفتاح الأساسي PK والمفتاح الأجنبي FK، تُحفظ كل معلومة في موضع واحد موثوق.
CREATE TABLE customers (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
تُعد علاقة واحد لمتعدد (1:N) العمود الفقري لتصميم قواعد البيانات العلائقية (مثل: قسم واحد يضم عدة موظفين، أو عميل واحد ينشئ عدة طلبات):
- القاعدة الذهبية لموقع المفتاح الأجنبي: يوضع عمود المفتاح الأجنبي دائماً في جدول الطرف «المتعدد» (الابن) ليشير إلى المفتاح الأساسي في جدول الطرف «الواحد» (الأب).
- قبول تكرار المفتاح الأجنبي: نظراً لأن العميل الواحد قد يطلب 10 مرات، فإن العمود
customer_idداخل جدولordersيسمح بتكرار رقم العميل عبر عدة صفوف.
CREATE TABLE orders (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id INT UNSIGNED NOT NULL,
order_total DECIMAL(10, 2) NOT NULL,
CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
تربط علاقة واحد لواحد (1:1) سجلاً واحداً في الجدول الأول بسجل واحد فقط على الأكثر في الجدول الثاني (مثل جدول الحسابات السريع users وجدول الهوية التفصيلي user_profiles):
- متى نستخدم فصل 1:1؟ لعزل البيانات السرية الحساسة أو الحقول النصية الضخمة النادرة الاستخدام عن جدول تسجيل الدخول السريع.
- كيف نفرض 1:1 برمجياً في SQL؟ بإضافة قيد التفرد
UNIQUEعلى عمود المفتاح الأجنبي، أو جعل عمود المفتاح الأجنبي نفسه هوPRIMARY KEYللجدول التابع.
CREATE TABLE user_profiles (
user_id INT UNSIGNED PRIMARY KEY,
passport_no VARCHAR(30) NOT NULL UNIQUE,
bio_summary TEXT,
CONSTRAINT fk_profile_user
FOREIGN KEY (user_id) REFERENCES customers(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
في علاقة متعدد لمتعدد (M:N)، يرتبط السجل الواحد في الجدول الأول بعدة سجلات في الجدول الثاني، والعكس صحيح أيضاً (مثل: الطلاب والدورات التدريبية، أو الطلبات والمنتجات):
- استحالة الربط المباشر بين الجدولين: لا يمكن تخزين قائمة أرقام دورات داخل خلية واحدة في جدول الطلاب.
- الحل الهندسي عبر جدول الربط الوسيط (Junction / Pivot Table): ننشئ جدولاً ثالثاً وسيطاً (مثل
enrollments) يحتوي على مفتاحين أجنبيين؛ فيفكك علاقةM:Nالمعقدة إلى علاقتي1:Nقياسيتين.
CREATE TABLE enrollments (
student_id INT UNSIGNED NOT NULL,
course_id INT UNSIGNED NOT NULL,
enrolled_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES customers(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
عند هندسة مفاتيح جدول الربط الوسيط مثل order_items أو user_roles، تتاح أمامك طريقتان قياسيتان:
- المفتاح الأساسي المركب
PRIMARY KEY (order_id, product_id): يجعل زوج المفتاحين الأجنبيين هو المفتاح الأساسي العنقودي مباشرة في InnoDB، مما يمنع تكرار نفس المنتج داخل نفس الطلب دون الحاجة لعمود ترقيم إضافي. - مفتاح متسلسل
idمع قيدUNIQUE (order_id, product_id): يُستخدم عندما تتطلب أطر العمل معرفاً مفرداً مع الحفاظ على منع ازدواج الزوج.
CREATE TABLE order_items (
order_id INT UNSIGNED NOT NULL,
product_id INT UNSIGNED NOT NULL,
quantity SMALLINT UNSIGNED NOT NULL DEFAULT 1,
unit_price DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
تلخص المصفوفة المرجعية التالية الفروق الهندسية بين أنواع العلاقات الثلاث بين الجداول في MySQL 8:
| نوع العلاقة | موقع عمود المفتاح الأجنبي FK | قاعدة التفرد | مثال تطبيقي قياسي |
|---|---|---|---|
واحد لمتعدد (1:N) | داخل جدول الطرف المتعدد (الابن) | يسمح بتكرار المفتاح الأجنبي | العملاء customers والطلبات orders |
واحد لواحد (1:1) | داخل الجدول الفرعي التابع | المفتاح الأجنبي مقيد بـ UNIQUE أو PK | المستخدمون users والملف الشخصي |
متعدد لمتعدد (M:N) | داخل جدول ربط وسيط ثالث | مفتاح مركب PRIMARY KEY (fk1, fk2) | الطلاب والدورات عبر enrollments |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس أسباب تقسيم البيانات عبر الجداول، وكيفية بناء علاقة واحد لمتعدد (1:N) بوضع المفتاح الأجنبي في جدول الابن، وفرض علاقة واحد لواحد (1:1) بقيد UNIQUE أو المفتاح المشترك، وحل علاقة متعدد لمتعدد (M:N) عبر جدول الربط الوسيط ذي المفتاح الأساسي المركب.
الخطوة التالية والدرس القادم
انتقل الآن إلى الدرس التاسع والثلاثين «تطبيع قواعد البيانات والصيغ المعيارية الأولى والثانية والثالثة في MySQL» لإتقان قواعد التطبيع القياسية 1NF و2NF و3NF.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Table Relationships علاقات الجداول
- تعلّم العلاقات بين الجداول واحد لواحد وواحد لمتعدد ومتعدد لمتعدد في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 Why Split Data Across Tables لماذا نقسم البيانات بالجداول
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم لماذا نقسم البيانات بالجداول في MySQL 8.
- للمراجعة
- 03 One to Many Relationship Pattern علاقة واحد لمتعدد العلائقية
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم علاقة واحد لمتعدد العلائقية في MySQL 8.
- للمراجعة
- 04 One to One Relationship Pattern علاقة واحد لواحد بـ UNIQUE
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم علاقة واحد لواحد بـ UNIQUE في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 ERD ERD
- Entity-Relationship Diagram
- مخطط الكيانات والعلاقات الهندسي الذي يوضح الجداول والمفاتيح والعلاقات 1:1 و 1:N و M:N.
- للمراجعة
- 02 PK PK
- Primary Key
- المفتاح الأساسي الفريد الذي يميز كل صف داخل الجدول ولا يقبل التكرار أو الفراغ.
- للمراجعة
- 03 FK FK
- Foreign Key
- المفتاح الأجنبي في جدول الابن الذي يشير إلى المفتاح الأساسي في جدول الأب لضمان التكامل المرجعي.
- للمراجعة
- 04 ORM ORM
- Object-Relational Mapping
- طبقة ربط الكائنات بالعلاقات (مثل Laravel Eloquent) التي تمثل علاقات الجداول برمجياً.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ استعلامات SQL المشروحة في قسم لماذا نقسم البيانات بالجداول داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم علاقة واحد لمتعدد العلائقية وقارن مخرجات الاستعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
في علاقة واحد لمتعدد (1:N) بين جدول العملاء customers (الواحد) وجدول الطلبات orders (المتعدد)، أين يوضع عمود المفتاح الأجنبي؟
يوضع عمود المفتاح الأجنبي دائماً في جدول الطرف المتعدد (الابن) وهو جدول orders.
كيف تفرض علاقة واحد لواحد (1:1) صارمة على عمود المفتاح الأجنبي في MySQL؟
إضافة قيد التفرد UNIQUE على عمود المفتاح الأجنبي (أو جعله مفتاحاً أساسياً للجدول التابع) تمنع تكرار السجل لنفس الأب.
كيف يتم تطبيق علاقة متعدد لمتعدد (M:N) بين جدول الطلاب وجدول الدورات في قواعد البيانات العلائقية؟
بإنشاء جدول ربط وسيط ثالث يضم مفتاحين أجنبيين يشيران إلى الجدولين الأساسيين.
تعريف المفتاح الأساسي المركب PRIMARY KEY (student_id, course_id) في جدول التسجيل الوسيط يمنع تسجيل نفس الطالب في نفس الدورة مرتين.
صواب؛ يفرض المفتاح الأساسي المركب عدم تكرار نفس الزوج من القيم معاً.
في محرك InnoDB، يجب أن يتطابق عمود المفتاح الأجنبي مع عمود المفتاح الأساسي المرجعي في نوع البيانات وخاصية UNSIGNED.
صواب؛ عدم تطابق النوع أو الإشارة بين المفتاحين يؤدي لرفض إنشاء القيد في InnoDB.
عندما يفكك جدول الربط الوسيط علاقة متعدد لمتعدد (M:N)، إلى ماذا يحولها هندسياً؟
يفكك الجدول الوسيط علاقة M:N الواحدة إلى علاقتي واحد لمتعدد (1:N) قياسيتين.
أي عمودين مما يلي يوضعان عادةً كبيانات إضافية للعلاقة داخل جدول الربط الوسيط order_items؟ (اختر إجابتين)
الكمية quantity وسعر الوحدة وقت الشراء unit_price يصفان علاقة المنتج بالطلب المحدد.
ما هو نمط العلاقة الأنسب لفصل بيانات الهوية وجواز السفر الحساسة والنادرة الاستعلام عن جدول المستخدمين الرئيسي users؟
علاقة واحد لواحد (1:1) تحافظ على خفة وسرعة جدول المستخدمين مع عزل البيانات الحساسة في جدول مستقل.