طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 122 · برمجة قواعد البيانات
الدرس 7 · الوحدة 4: تصميم جداول البيانات بالعلاقات والفهارس

تصميم الجداول والعلاقات

كيف تتحول كيانات المتجر إلى جداول مترابطة بمفاتيح؟ ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تحدد الكيانات وصفاتها ومفاتيحها الأساسية.
  • تميّز العلاقات 1:1 و 1:N و N:M وكيف تُنفّذ.
  • تقرأ مخطط الكيانات ERD.
  • تصمم جدول ربط بمفتاح مركّب ومفاتيح أجنبية.

١من الواقع إلى الجداول

التصميم الجيد يبدأ بسؤال: ما الكيانات Entities التي نحفظ عنها بيانات؟ في المتجر: التصنيف، والمنتج، والعميل، والطلب. كل كيان جدول، وكل صفة عمود، وكل صف يُعرف بـمفتاح أساسي لا يتكرر ولا يكون فارغًا.

يضم

يطلب

يحتوي

يرد في

CATEGORIES

int

id

PK

text

name

UK

PRODUCTS

int

id

PK

int

category_id

FK

numeric

price

int

stock

CUSTOMERS

int

id

PK

text

city

text

email

UK

ORDERS

int

id

PK

int

customer_id

FK

date

order_date

text

status

ORDER_ITEMS

int

order_id

PK,FK

int

product_id

PK,FK

int

qty

numeric

unit_price

مخطط الكيانات لقاعدة «متجر الريان»: الخط والرموز في طرفيه تبيّن نوع العلاقة.

٢أنواع العلاقات

العلاقةمثالكيف تُنفَّذ؟
واحد إلى كثير 1:Nعميل واحد ← طلبات كثيرةمفتاح أجنبي في جدول «الكثير»: orders.customer_id
كثير إلى كثير N:Mالطلب فيه منتجات كثيرة، والمنتج في طلبات كثيرةجدول ربط فيه مفتاحان أجنبيان: order_items
واحد إلى واحد 1:1عميل ← ملف تفضيلات واحدمفتاح أجنبي فريد UNIQUE، أو المفتاح الأساسي نفسه

جدول الربط order_items ليس مجرد وصلة: يحمل بيانات العلاقة نفسها، مثل الكمية وسعر الوحدة يوم الشراء. ومفتاحه الأساسي مركّب من العمودين معًا، فلا يتكرر المنتج في الطلب نفسه.

٣العلاقات في الاستعلام: JOIN

المفاتيح الأجنبية هي الطرق التي تسلكها الاستعلامات بين الجداول. «ما الذي اشترته سارة؟» يمر بأربعة جداول:

query.sql
SELECT o.id AS الطلب, o.order_date, p.name AS المنتج, i.qtyFROM customers cJOIN orders o       ON o.customer_id = c.idJOIN order_items i  ON i.order_id = o.idJOIN products p     ON p.id = i.product_idWHERE c.name = 'سارة'ORDER BY o.id;
النتيجة · 5 صفوف
الطلبorder_dateالمنتجqty
12025-09-01حاسب محمول1
12025-09-01فأرة لاسلكية2
32025-09-10فأرة لاسلكية1
32025-09-10لوحة مفاتيح1
112025-10-09دفتر ملاحظات20

توقّع وتحقّق

أين يوضع المفتاح الأجنبي في علاقة 1:N؟

كيف تُنفّذ علاقة كثير إلى كثير؟

لماذا مفتاح order_items مركّب؟

الرمز ||--o{ في مخطط الكيانات يعني:

الخلاصة

تحدٍّ برمجي: تقييمات المنتجات

متوسط

يريد المتجر أن يقيّم العملاء المنتجات: كل عميل يقيّم المنتج مرة واحدة فقط، بدرجة من 1 إلى 5 وتعليق اختياري. صمّم الجدول reviews.

المطلوب:
  • العمودان customer_id و product_id مفتاحان أجنبيان، ومعًا مفتاح أساسي مركّب.
  • العمود rating عدد صحيح إلزامي من 1 إلى 5 (CHECK).
  • العمود comment نص اختياري.
👀 اعرض الناتج المطلوب
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء
  • تقييم صحيح يُقبل
  • العميل لا يقيّم المنتج نفسه مرتين
  • منتج غير موجود يُرفض
  • الدرجة 6 تُرفض
  • الدرجة إلزامية
  • التعليق اختياري ويُقبل

💡 تلميح 1
المفتاح المركّب يُكتب في آخر الجدول: PRIMARY KEY (customer_id, product_id).
💡 تلميح 2
المدى: CHECK (rating BETWEEN 1 AND 5).

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

solution.sql
CREATE TABLE reviews (  customer_id int REFERENCES customers(id),  product_id  int REFERENCES products(id),  rating      int NOT NULL CHECK (rating BETWEEN 1 AND 5),  comment     text,  PRIMARY KEY (customer_id, product_id));
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس