يا هلا بالشباب! اليوم بنتكلم عن موضوع مهم جداً في قواعد البيانات SQL، وهو العلاقات بين الجداول. لو ما فهمت هذا الجزء، صدقني بتعاني كثير في بناء تطبيقات قوية ومنظمة.
ليش نحتاج العلاقات؟
بكل بساطة، عشان نحافظ على بياناتنا مرتبة، متناسقة، ونتجنب التكرار (Data Redundancy). تخيل لو عندك جدول واحد لكل شيء، بيصير حوسة وما تقدر تسوي استعلامات معقدة بسهولة. العلاقات تخلينا نقسم البيانات لكيانات منطقية مترابطة.
أنواع العلاقات
1. علاقة رأس-لـ-رأس (One-to-One)
هذي العلاقة معناها إن كل صف في الجدول الأول يرتبط بصف واحد فقط في الجدول الثاني، والعكس صحيح. نادراً ما تستخدم لوحدها، غالباً تكون لتفصيل بيانات جدول أساسي.
مثال: ممكن يكون عندك جدول للمستخدمين
Usersوجدول ثاني لملفاتهم الشخصية التفصيليةUserProfilesاللي فيها معلومات خاصة ما تحتاجها لكل مستخدم دائماً.
كيف نسويها؟ نستخدم مفتاح أساسي (Primary Key) في الجدول الأول ونخليه مفتاح أجنبي (Foreign Key) وفريد (Unique) في الجدول الثاني.
2. علاقة رأس-لـ-أطراف (One-to-Many)
هذي أشهر وأكثر علاقة تستخدمها. معناها إن صف واحد في الجدول الأول ممكن يرتبط بعدة صفوف في الجدول الثاني، لكن كل صف في الجدول الثاني يرتبط بصف واحد فقط في الجدول الأول.
مثال: مؤلف
Authorواحد ممكن يكتب عدة كتبBooks. لكن الكتاب الواحد ما يكون له إلا مؤلف واحد (في هذا السيناريو البسيط).
كيف نسويها؟ الجدول اللي فيه "الطرف الواحد" (مثل Authors) يكون فيه مفتاح أساسي PRIMARY KEY. الجدول اللي فيه "الأطراف المتعددة" (مثل Books) يكون فيه عمود يكون مفتاح أجنبي FOREIGN KEY يشير للمفتاح الأساسي في الجدول الأول.
هنا، author_id في جدول Books هو المفتاح الأجنبي اللي يربط كل كتاب بمؤلفه.
3. علاقة أطراف-لـ-أطراف (Many-to-Many)
هذي العلاقة معناها إن صف واحد في الجدول الأول ممكن يرتبط بعدة صفوف في الجدول الثاني، وكمان صف واحد في الجدول الثاني ممكن يرتبط بعدة صفوف في الجدول الأول.
مثال: الطالب
Studentممكن يسجل في عدة موادCourses. والمادة الواحدة ممكن يسجل فيها عدة طلاب.
كيف نسويها؟ ما تقدر تسويها بشكل مباشر بين الجدولين. لازم تسوي جدول وسيط (Junction Table أو Linking Table) يربط بين الاثنين. هذا الجدول الوسيط يكون فيه مفتاحين أجنبيين، كل واحد يشير لجدول من الجداول الأصلية.
هنا، StudentCourses هو الجدول الوسيط. المفتاح الأساسي فيه مكون من student_id و course_id مع بعض، عشان نضمن إن الطالب ما يسجل في نفس المادة مرتين بنفس الوقت.
إجراءات المفتاح الأجنبي (Foreign Key Actions)
لما تحذف أو تحدث صف في الجدول الأساسي (اللي فيه الـ PRIMARY KEY)، وش يصير للصفوف المرتبطة فيه في الجدول اللي فيه الـ FOREIGN KEY؟ هنا تجي أهمية الإجراءات:
ON DELETE CASCADE: إذا حذفت صف في الجدول الأساسي، تنحذف كل الصفوف المرتبطة فيه تلقائياً من الجدول الثانوي. (انتبه! ممكن تحذف بيانات كثيرة بالغلط).ON UPDATE CASCADE: إذا حدثت قيمة المفتاح الأساسي في الجدول الأساسي، تتحدث تلقائياً في المفتاح الأجنبي في الجدول الثانوي.ON DELETE SET NULL: إذا حذفت صف في الجدول الأساسي، قيمة المفتاح الأجنبي في الصفوف المرتبطة تصيرNULL. (طبعاً لازم يكون العمود يقبلNULL).ON DELETE RESTRICT(افتراضي): يمنع حذف الصف من الجدول الأساسي إذا كان فيه صفوف مرتبطة به في الجدول الثانوي.
مثال على استخدامها:
هذا يعني لو حذفت مؤلف من جدول Authors، كل كتبه في جدول Books راح تنحذف تلقائياً. ولو غيرت author_id لمؤلف، راح يتغير في كل كتبه.
خلاصة
فهم العلاقات بين الجداول هو حجر الزاوية في تصميم قواعد البيانات الاحترافية. استخدم PRIMARY KEY و FOREIGN KEY صح، واختار نوع العلاقة المناسب، ولا تنسى إجراءات الحذف والتحديث عشان تحافظ على تكامل بياناتك. بالتوفيق يا وحوش!