من المخطط إلى الجداول
نحوّل المخطط إلى أوامر CREATE TABLE بقواعد ثابتة. ⏱ نحو 30 دقيقة.
- تطبّق قواعد تحويل المخطط إلى جداول.
- تنفّذ علاقات
1:Nو 1:1 وM:Nبالمفاتيح والقيود. - تعالج الخاصية المتعددة القيم بجدول مستقل.
- تنشئ الجداول وتدخل البيانات بالترتيب الصحيح.
١قواعد التحويل
المخطط جاهز؛ والتحويل إلى جداول يتبع قواعد ثابتة لا اجتهاد فيها:
| في المخطط | في القاعدة |
|---|---|
| كيان | جدول، اسمه جمع بالإنجليزية. |
| خاصية بسيطة | عمود بنوع مناسب. |
| خاصية مفتاح | PRIMARY KEY |
| خاصية إلزامية | NOT NULL |
علاقة 1:N | مفتاح أجنبي في جدول «المتعدد». |
| علاقة 1:1 | مفتاح أجنبي UNIQUE في أحد الجدولين. |
علاقة M:N | جدول وسيط بمفتاحين أجنبيين يكوّنان معًا المفتاح الأساسي. |
| خاصية متعددة القيم | جدول مستقل: المفتاح الأجنبي + القيمة. |
| خاصية مشتقة | لا عمود لها؛ تُحسب في الاستعلام. |
٢مثال كامل: عيادة الأسنان
هذا حل تحدي الدرس 7 بعد إضافة العلاقات:
نطبّق القواعد: ثلاثة كيانات تصير ثلاثة جداول، والعلاقتان 1:N تصيران مفتاحين أجنبيين في appointments. وأضفنا قاعدة عمل مهمة: الطبيب لا يُحجز له موعدان في الوقت نفسه:
CREATE TABLE patients ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, phone TEXT UNIQUE, birth_date TEXT);CREATE TABLE doctors ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, specialty TEXT NOT NULL);CREATE TABLE appointments ( id INTEGER PRIMARY KEY, patient_id INTEGER NOT NULL REFERENCES patients(id), doctor_id INTEGER NOT NULL REFERENCES doctors(id), appt_date TEXT NOT NULL, appt_time TEXT NOT NULL, reason TEXT, UNIQUE (doctor_id, appt_date, appt_time));INSERT INTO patients VALUES (1, 'منى السهلي', '0560000001', '1998-04-02'), (2, 'وليد الرحيلي', '0560000002', '1985-11-20');INSERT INTO doctors VALUES (1, 'د. هالة', 'تقويم'), (2, 'د. عماد', 'علاج عصب');INSERT INTO appointments VALUES (1, 1, 1, '2025-06-01', '09:00', 'تركيب تقويم'), (2, 2, 2, '2025-06-01', '10:30', 'ألم ضرس'), (3, 1, 1, '2025-06-15', '09:00', 'متابعة'); -- مواعيد المريضة منىSELECT appt_date, appt_time, reasonFROM appointmentsWHERE patient_id = 1;
| appt_date | appt_time | reason |
|---|---|---|
| 2025-06-01 | 09:00 | تركيب تقويم |
| 2025-06-15 | 09:00 | متابعة |
CREATE TABLE patients ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, phone TEXT UNIQUE, birth_date TEXT);CREATE TABLE doctors ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, specialty TEXT NOT NULL);CREATE TABLE appointments ( id INTEGER PRIMARY KEY, patient_id INTEGER NOT NULL REFERENCES patients(id), doctor_id INTEGER NOT NULL REFERENCES doctors(id), appt_date TEXT NOT NULL, appt_time TEXT NOT NULL, reason TEXT, UNIQUE (doctor_id, appt_date, appt_time));INSERT INTO patients VALUES (1, 'منى السهلي', '0560000001', '1998-04-02'), (2, 'وليد الرحيلي', '0560000002', '1985-11-20');INSERT INTO doctors VALUES (1, 'د. هالة', 'تقويم'), (2, 'د. عماد', 'علاج عصب');INSERT INTO appointments VALUES (1, 1, 1, '2025-06-01', '09:00', 'تركيب تقويم'), (2, 2, 2, '2025-06-01', '10:30', 'ألم ضرس'), (3, 1, 1, '2025-06-15', '09:00', 'متابعة'); -- حجز مزدوج عند د. هالةINSERT INTO appointments VALUES (4, 2, 1, '2025-06-01', '09:00', 'تنظيف');
القيد UNIQUE (doctor_id, appt_date, appt_time) منع الحجز المزدوج. القيود تحرس قواعد العمل أيضًا.
٣الخاصية المتعددة القيم: جدول مستقل
للمريض أكثر من رقم جوال؟ لا نضيف phone2 و phone3، بل جدولًا جديدًا كل صف فيه رقم واحد:
CREATE TABLE patients ( id INTEGER PRIMARY KEY, name TEXT, phone1 TEXT, phone2 TEXT, phone3 TEXT -- والرابع؟);
CREATE TABLE patient_phones ( patient_id INTEGER REFERENCES patients(id), phone TEXT, PRIMARY KEY (patient_id, phone));
مع الأعمدة المكررة: كيف تبحث عن رقم؟ في ثلاثة أعمدة! ومريض له رقم واحد يترك عمودين فارغين. أما الجدول المستقل فيقبل أي عدد، والبحث في عمود واحد.
٤علاقة 1:1
لكل موظف سيارة واحدة على الأكثر من سيارات الشركة، ولكل سيارة موظف واحد. نضع المفتاح الأجنبي في جدول السيارات مع UNIQUE:
CREATE TABLE employees (id INTEGER PRIMARY KEY, name TEXT);CREATE TABLE cars ( plate TEXT PRIMARY KEY, model TEXT, employee_id INTEGER UNIQUE REFERENCES employees(id));INSERT INTO employees VALUES (1, 'سامي'), (2, 'هاني');INSERT INTO cars VALUES ('أ ب ج 1234', 'كامري', 1);INSERT INTO cars VALUES ('د هـ و 5678', 'سوناتا', 1);
UNIQUE منعت سيارة ثانية لسامي، فبقيت العلاقة 1:1.
٥ترتيب التنفيذ
- أنشئ الجداول المستقلة أولًا (التي لا مفاتيح أجنبية فيها): المرضى والأطباء.
- ثم الجداول التي تشير إليها: المواعيد.
- ثم أدخل البيانات بالترتيب نفسه: الآباء قبل الأبناء.
- وعند الحذف: العكس، الأبناء قبل الآباء.
توقّع وتحقّق
علاقة 1:1 تُنفَّذ بمفتاح أجنبي مع:
خاصية متعددة القيم تصير:
أي جدول يُنشأ أولًا في العيادة؟
منع موعدين لطبيب في الوقت نفسه:
الخلاصة
- كيان ← جدول، خاصية ← عمود، مفتاح ←
PRIMARY KEY. 1:N← مفتاح أجنبي في المتعدد. 1:1 ← مفتاح أجنبيUNIQUE.M:N← جدول وسيط.- الخاصية المتعددة القيم جدول مستقل، لا أعمدة مكررة.
- قواعد العمل تُنفَّذ بقيود مثل
UNIQUEالمركّب. - الآباء قبل الأبناء عند الإنشاء والإدخال.
تحدٍّ برمجي: نفّذ مخطط المكتبة
صعبحوّل مخطط المكتبة (تحدي الدرس 8) إلى جداول: الأعضاء والكتب والإعارات.
members:idمفتاح،nameإلزامي،phoneلا يتكرر.books:isbnمفتاح نصي،titleإلزامي.loans:idمفتاح،member_idوisbnمفتاحان أجنبيان إلزاميان،loan_dateإلزامي،return_dateاختياري.
👀 اعرض النتيجة المطلوبة
- الكود يعمل بلا أخطاء
- يقبل عضوًا وكتابًا
- يقبل إعارة بلا تاريخ إرجاع
- يرفض إعارة لعضو غير موجود
- يرفض إعارة لكتاب غير موجود
- يرفض إعارة بلا تاريخ
- يرفض جوالًا مكررًا
💡 تلميح 1
💡 تلميح 2
isbn TEXT NOT NULL REFERENCES books(isbn)حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
CREATE TABLE members ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, phone TEXT UNIQUE);CREATE TABLE books ( isbn TEXT PRIMARY KEY, title TEXT NOT NULL);CREATE TABLE loans ( id INTEGER PRIMARY KEY, member_id INTEGER NOT NULL REFERENCES members(id), isbn TEXT NOT NULL REFERENCES books(isbn), loan_date TEXT NOT NULL, return_date TEXT);