انتقل إلى محتوى الدرس
الدرس 38
دورة MySQL

العلاقات بين الجداول واحد لواحد وواحد لمتعدد ومتعدد لمتعدد في MySQLMySQL Relational Table Relationships One to One One to Many and Many to Many

تعلّم العلاقات بين الجداول واحد لواحد وواحد لمتعدد ومتعدد لمتعدد في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

إن تكديس بيانات العملاء مع طلباتهم وتفاصيل المنتجات داخل جدول مسطح واحد ضخم (أشبه بملف جدول بيانات تقليدي) يؤدي إلى مشاكل هندسية خطيرة:

  • التكرار المهدر للبيانات: يتكرر اسم العميل وبريده وعنوانه مع كل طلب جديد يشتريه.
  • تضارب التحديثات: عند تغيير رقم هاتف العميل في بعض الصفوف ونسيان أخرى، تتلف موثوقية البيانات.
  • الفصل العلائقي بالكيانات: عبر تقسيم كل كيان مستقل (customers، orders، products) في جدول InnoDB خاص به وربطها عبر المفتاح الأساسي PK والمفتاح الأجنبي FK، تُحفظ كل معلومة في موضع واحد موثوق.
مخطط يقارن بين علاقات الجداول واحد لمتعدد 1:N وواحد لواحد 1:1 بـ UNIQUE ومتعدد لمتعدد M:N عبر جدول الربط الوسيط في MySQL 8
SQL
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 يسمح بتكرار رقم العميل عبر عدة صفوف.
SQL
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 للجدول التابع.
SQL
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 قياسيتين.
SQL
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): يُستخدم عندما تتطلب أطر العمل معرفاً مفرداً مع الحفاظ على منع ازدواج الزوج.
SQL
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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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) التي تمثل علاقات الجداول برمجياً.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ استعلامات SQL المشروحة في قسم لماذا نقسم البيانات بالجداول داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم علاقة واحد لمتعدد العلائقية وقارن مخرجات الاستعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

في علاقة واحد لمتعدد (1:N) بين جدول العملاء customers (الواحد) وجدول الطلبات orders (المتعدد)، أين يوضع عمود المفتاح الأجنبي؟

يوضع عمود المفتاح الأجنبي دائماً في جدول الطرف المتعدد (الابن) وهو جدول orders.

02

كيف تفرض علاقة واحد لواحد (1:1) صارمة على عمود المفتاح الأجنبي في MySQL؟

إضافة قيد التفرد UNIQUE على عمود المفتاح الأجنبي (أو جعله مفتاحاً أساسياً للجدول التابع) تمنع تكرار السجل لنفس الأب.

03

كيف يتم تطبيق علاقة متعدد لمتعدد (M:N) بين جدول الطلاب وجدول الدورات في قواعد البيانات العلائقية؟

بإنشاء جدول ربط وسيط ثالث يضم مفتاحين أجنبيين يشيران إلى الجدولين الأساسيين.

04

تعريف المفتاح الأساسي المركب PRIMARY KEY (student_id, course_id) في جدول التسجيل الوسيط يمنع تسجيل نفس الطالب في نفس الدورة مرتين.

صواب؛ يفرض المفتاح الأساسي المركب عدم تكرار نفس الزوج من القيم معاً.

05

في محرك InnoDB، يجب أن يتطابق عمود المفتاح الأجنبي مع عمود المفتاح الأساسي المرجعي في نوع البيانات وخاصية UNSIGNED.

صواب؛ عدم تطابق النوع أو الإشارة بين المفتاحين يؤدي لرفض إنشاء القيد في InnoDB.

06

عندما يفكك جدول الربط الوسيط علاقة متعدد لمتعدد (M:N)، إلى ماذا يحولها هندسياً؟

يفكك الجدول الوسيط علاقة M:N الواحدة إلى علاقتي واحد لمتعدد (1:N) قياسيتين.

07

أي عمودين مما يلي يوضعان عادةً كبيانات إضافية للعلاقة داخل جدول الربط الوسيط order_items؟ (اختر إجابتين)

الكمية quantity وسعر الوحدة وقت الشراء unit_price يصفان علاقة المنتج بالطلب المحدد.

08

ما هو نمط العلاقة الأنسب لفصل بيانات الهوية وجواز السفر الحساسة والنادرة الاستعلام عن جدول المستخدمين الرئيسي users؟

علاقة واحد لواحد (1:1) تحافظ على خفة وسرعة جدول المستخدمين مع عزل البيانات الحساسة في جدول مستقل.