تصميم الجداول والعلاقات
كيف تتحول كيانات المتجر إلى جداول مترابطة بمفاتيح؟ ⏱ نحو 40 دقيقة.
- تحدد الكيانات وصفاتها ومفاتيحها الأساسية.
- تميّز العلاقات 1:1 و
1:NوN:Mوكيف تُنفّذ. - تقرأ مخطط الكيانات
ERD. - تصمم جدول ربط بمفتاح مركّب ومفاتيح أجنبية.
١من الواقع إلى الجداول
التصميم الجيد يبدأ بسؤال: ما الكيانات Entities التي نحفظ عنها بيانات؟ في المتجر: التصنيف، والمنتج، والعميل، والطلب. كل كيان جدول، وكل صفة عمود، وكل صف يُعرف بـمفتاح أساسي لا يتكرر ولا يكون فارغًا.
٢أنواع العلاقات
| العلاقة | مثال | كيف تُنفَّذ؟ |
|---|---|---|
واحد إلى كثير 1:N | عميل واحد ← طلبات كثيرة | مفتاح أجنبي في جدول «الكثير»: orders.customer_id |
كثير إلى كثير N:M | الطلب فيه منتجات كثيرة، والمنتج في طلبات كثيرة | جدول ربط فيه مفتاحان أجنبيان: order_items |
| واحد إلى واحد 1:1 | عميل ← ملف تفضيلات واحد | مفتاح أجنبي فريد UNIQUE، أو المفتاح الأساسي نفسه |
جدول الربط order_items ليس مجرد وصلة: يحمل بيانات العلاقة نفسها، مثل الكمية وسعر الوحدة يوم الشراء. ومفتاحه الأساسي مركّب من العمودين معًا، فلا يتكرر المنتج في الطلب نفسه.
٣العلاقات في الاستعلام: JOIN
المفاتيح الأجنبية هي الطرق التي تسلكها الاستعلامات بين الجداول. «ما الذي اشترته سارة؟» يمر بأربعة جداول:
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;
| الطلب | order_date | المنتج | qty |
|---|---|---|---|
| 1 | 2025-09-01 | حاسب محمول | 1 |
| 1 | 2025-09-01 | فأرة لاسلكية | 2 |
| 3 | 2025-09-10 | فأرة لاسلكية | 1 |
| 3 | 2025-09-10 | لوحة مفاتيح | 1 |
| 11 | 2025-10-09 | دفتر ملاحظات | 20 |
توقّع وتحقّق
أين يوضع المفتاح الأجنبي في علاقة 1:N؟
كيف تُنفّذ علاقة كثير إلى كثير؟
لماذا مفتاح order_items مركّب؟
الرمز ||--o{ في مخطط الكيانات يعني:
الخلاصة
- كل كيان جدول، وكل صف يُعرف بمفتاح أساسي.
1:N← مفتاح أجنبي في جدول «الكثير».N:M← جدول ربط بمفتاحين أجنبيين، ومفتاحه مركّب غالبًا.- جدول الربط يحمل بيانات العلاقة (الكمية والسعر).
- صمّم وأنت تفكر في الاستعلامات المتكررة.
تحدٍّ برمجي: تقييمات المنتجات
متوسطيريد المتجر أن يقيّم العملاء المنتجات: كل عميل يقيّم المنتج مرة واحدة فقط، بدرجة من 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).حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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));