NahdaAIنهضة
SQL Databases • المستوى الثالث • الدرس 1

المفاتيح الأجنبية ونمذجة العلاقات (Foreign Keys & Relationships)

العودة لفهرس المستوى

أهداف الدرس

  • فهم أهمية المفاتيح الأجنبية FOREIGN KEY للربط والتكامل المرجعي.
  • تنسيق سلوك الحذف التلقائي بـ ON DELETE CASCADE للحفاظ على سلامة البيانات.
  • التمييز بين أنواع العلاقات: واحد لواحد، واحد لمتعدد، متعدد لمتعدد.
  • استخدام القيد بصيغة العمود REFERENCES أو بصيغة الجدول FOREIGN KEY.

1. نمذجة العلاقات بين الجداول

تعتمد قواعد البيانات العلاقلية على ربط سجلات الجداول ببعضها بواسطة الـ Foreign Key (مثل ربط كل طلب في جدول الطلبات بمعرف المستخدم ID الصادر من جدول المستخدمين).

sql
-- ربط جدولين (One-to-Many)
-- users (1) --------- (∞) orders
-- مستخدم واحد -> عدة طلبات

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT NOT NULL,
  total_amount DECIMAL(10, 2) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

2. أنواع العلاقات في قواعد البيانات

One-to-One (1:1)

سجل واحد ↔ سجل واحد.

مثال: user ↔ profile

One-to-Many (1:N)

سجل واحد ↔ عدة سجلات (الأكثر شيوعاً).

مثال: user ↔ orders

Many-to-Many (N:M)

يحتاج جدول وسيط (Junction Table).

مثال: students ↔ courses

3. سلوك الحذف ON DELETE

ON DELETE CASCADE

عند حذف المستخدم، تُحذف كل طلباته تلقائياً.

FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE
ON DELETE RESTRICT

يرفض حذف المستخدم إذا كان لديه طلبات (الحماية الافتراضية).

FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE RESTRICT
ON DELETE SET NULL

يضع الحقل NULL عند حذف السجل الأب.

ON DELETE NO ACTION

مثل RESTRICT — يرفض الحذف إلا بعد معالجة الأبناء.

4. صيغتان لتعريف Foreign Key

صيغة العمود (Column Level)
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id)
);
صيغة الجدول (Table Level)
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
);
التطبيق العملي المباشر

تحدي الدرس الأول: توسيع نموذج قاعدة البيانات

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. أضف حقل status VARCHAR(30) DEFAULT 'pending' لجدول orders.
  2. أضف جدول order_items يحتوي على: id SERIAL PRIMARY KEY، order_id INT NOT NULL، product_name VARCHAR(150) NOT NULL، quantity INT DEFAULT 1، unit_price DECIMAL(10, 2) NOT NULL.
  3. أضف FOREIGN KEY في order_items يشير إلى orders(id) مع ON DELETE CASCADE.
  4. أضف جدول products بـ 4 حقول على الأقل: id، name، price، stock.
  5. احتفظ بجدولي users و orders الأصليين.
  6. اضغط "تشغيل الكود" لرؤية نجاح إنشاء الجداول.
⏳ جارٍ تحميل المحرر التفاعلي...