دورة الأكسيس : الدرس الرابع : العلاقات
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .
العلاقات RelationShip
قبل أن نبدأ نود أن نعرف أولاً لماذا نستخدم العلاقات ؟ لنعرف ذلك لا بد لنا أولاً أن نعرف ما معنى علاقة .
يقصد العلاقة هو اشتراك حقل بين جدولين بحيث تملك كل قيمة في هذا الحقل سجلين ، السجل الأول في الجدول الأول والسجل الثاني في الجدول الآخر .
نعود إلى سؤالنا السابق : نستخدم العلاقة لنضمن شيئين رئيسيين :
أولاً : تحقيق تكامل حقيقي بين جداول قاعدة البيانات .
ثانياً : منع تكرار القيم في أي من الجداول لمنع إهدار حجم قواعد البيانات .
ربما لم نبدأ بعد ، ولكن لنرى مثالاً سريعاً نضيفه سوياً لقاعدة البيانات التي كنا نعمل عليها الدروس السابقة .
لنقل أننا نريد أن نريد أن نقسم الأصدقاء إلى أربع مجموعات - مثلاً - بحسب السنة الدراسية في الكلية على سبيل المثال ، ونريد أن نعرف عن كل سنة عدد الطلبة فيها وعدد المواد الدراسية .
إذا كنا نعمل بالطريقة التقليدية فسنقول : نضيف لكل صديق حقل خاص بالسنة ، وحقل آخر خاص بعدد الطلبة العام وحقل ثالث بعدد المواد .
لكن لاحظ كم مرة سنكرر عدد المواد ، وعدد الطلبة .
لاحظ أيضاً لو زادت مادة لطلبة أي سنة دراسية ، فهذا يعني أننا سنحدث بيانات جميع الحقول .
وقل نفس الأمر بالنسبة للحذف وغير ذلك .
ربما لا يتضح موضوع الحذف في مثالنا ( نوتة الهواتف ) ولكن سأخرج - جزئياً - عن الموضوع لأشرح مثالاً صغيراً على عملية الحذف .
لنفرض أن لدينا قاعدة بيانات تحتوي على الموظفين ويهمنا فقط اسم الموظف وفرع الشركة التي يعمل فيها ومكان الفرع .
إذا قامت الشركة مثلاً بحذف فرع ... فهذا يعني أن تقوم يدوياً - أو حتى بالكود - بحذف جميع الموظفين الذين ينتمون إلى هذا الفرع .
لكن الأمر ليس كذلك مع العلاقات ، فبمجرد حذف القسم سوف يحذف تلقائياً الموظفون التابعون له – طبعاً فقط إذا كنا نرغب في ذلك - .
لتلافي ذلك فإننا نستخدم ما يعرف بالعلاقات RelationShip .
أنواع العلاقات :
النوع الأول : One To One - علاقة واحد لواحد .
في هذه العلاقة نقول أن لكل سجل في القاعدة الرئيسية سجل واحد يقابله في القاعدة الثانية .
مثال على هذه العلاقة ضمن قاعدة بيانات الأصدقاء :
بفرض أننا نريد اضافة المعلومات الموجودة ضمن البطاقة الشخصية ( رقم البطاقة - فصيلة الدم - مصدر البطاقة )
نستطيع اضافة هذه الحقول مباشرة إلى الجدول الأول ، ولكن لاحظ كم سيصبح حجم هذا الجدول ، وبالتالي إذا حاولنا استخراج اسماء الأصدقاء فقط فسيستغرق المزيد من الوقت .
ربما لن يظهر ذلك مع قاعدتنا البسيطة ولكنه يظهر مع قواعد البيانات الضخمة .
إذن سنقوم بانشاء جدول جديد يحتوي على الحقول التالية ( رقم البطاقة - فصيلة الدم - مصدر البطاقة )
PassPort - BClass - From
تبقى شيء واحد وهو الحقل الذي يمثل رابطاً بين الجدولين .
وهذا الحقل الرابط له شروط هي :
* أن يكون موجوداً في الجدولين .
* أن يكون نوعه متطابقاً في الجدولين ( فلا يصلح أن يكون الأول رقم والثاني نص ) .
* أن يحتوي على قيم فريدة ( بمعنى أن لا يتكرر ) حتى لا يسبب المشاكل .
ولذا فإننا نقول أننا لا نستطيع أن نستخدم حقل الإسم لاخلاله بالشرط الثالث لاحتمال تشابه الأسماء .
لذلك فإن أنسب حقل هو حقل الرقم لأننا ذكرنا أنه سيحتوي على قيم فريدة ( غير متشابهه ) .
قم الآن باضافة حقل Number إلى الجدول السابق وعينه كمفتاح رئيسي Primary Key ، وقم بحفظ الجدول تحت اسم Tb_R1 أو أي اسم كما تحب .
النوع الثاني : One To Many - علاقة واحد لمجموعة ( والعكس صحيح ) .
في هذه العلاقة نقول إن لكل سجل في الجدول الرئيسي مجموعة سجلات في الجدول الثاني .
مثال ذلك المثال الذ قمنا بشرحه في الدرس السابق .
لو لاحظت المثال ستجد أن مجموعة من الطلاب يمكن أن يكون لهم سجل واحد في جدول الفرق ، لكن لا يمكن أن يكون لطالب ( سجل ) واحد أكثر من سجل آخر في جدول الفرق ( السنوات الدراسية ) .
وهذا هو الفرق بينه وبين النوع التالي .
لذا قم بانشاء جدول ثالث تحت اسم Tb_R2 ويحتوي على الحقول التالية :
Year - Books - Students
السنة - الكتب - الطلاب
يمكننا اضافة حقل جديد في الجدول الأول Tb_Main تحت اسم Year حيث سيكون هو الحقل الرابط بين الجدولين .
قم بالضغط على الجدول الأول ، ثم اضغط على ( تصميم - Design ) ، ثم قم بالضغط بزر الماوس الأيسر في المكان المطلوب ثم قم بالضغط على ( ادراج صف - Insert Row ) .
أيضاً لا تنس أن تجعل حقل Year مفتاح رئيسي في الجدول الثاني ( جدول الفرق الدراسية ) .
*** هذا النوع من علاقات هي الأكثر استخداماً .
النوع الثالث : Many To Many - علاقة مجموعة إلى مجموعة :
هل تتذكر العبارة التالية التي أوردتها في الدرس السابق ؟
لكن لا يمكن أن يكون لطالب ( سجل ) واحد أكثر من سجل آخر في جدول الفرق ( السنوات الدراسية ) .
إذا أزلنا ( لا ) فإننا نكون قد حصلنا على النوع الثالث .
مثال هذه العلاقة :
لو أردنا أن نضيف جدولاً يحتوي على اللغات فإننا سنلاحظ التالي :
* يمكن للشخص الواحد أن يكون له أكثر من لغة .
* ويمكن للغة الواحدة أن تكون موجودة عند أكثر من شخص .
للقيام بهذه النوعية من العلاقات فإننا نحتاج إلى جدول بسيط ، فمثلاً لدينا جدولين في البداية هما :
الرقم - الاسم .
1 - أحمد
2 - محمد
3 - خالد
4 - سامي
والثاني للغات :
الرقم - اللغة
1 - العربية
2 - الانجليزية
3 - الفرنسية
أما الجدول الإضافي فهو للعلاقة بين اللغات والأشخاص ، فلكي ندلل على أن أحمد يتحدث العربية والانجليزية ، فيما يتحدث محمد الفرنسية ، أما خالد فيتحدث الثلاث ، بينما لا يتحدث سامي أي لغة ! فإننا سوف نشكل الجدول التالي :
رقم الشخص - رقم اللغة
1 - 1
1 - 2
2 - 3
3 - 1
3 - 2
3 - 3
سنقوم الآن ببعض التعديلات على الجداول يصبح كما في المثال المرفق
http://www.c4arab.com/images/lessons/databases/general/cpic/db4.zipوالآن وبعد معرفة الانواع المختلفة سنبدأ الآن بانشاء العلاقات بين الجدول ، وتوجد طريقتين للقيام بذلك :
* عن طريق محرر العلاقات .
* عن طريق المعالج الموجود في نوع البيانات Data Types الموجود في خصائص الحقل .
وسوف نستخدم الطريقة الاولى .
سنبدأ الآن بإنشاء العلاقات بين جدول الأصدقاء وجدول معلومات البطاقة الشخصية ( تذكر أن العلاقة من نوع واحد إلى واحد One To One ) .
من قائمة ( Tools - أدوات ) اختر ( Relationships - علاقات ) سوف تظهر شاشة فارغة - افتراضياً - ... اضغط بزر الماوس الأيمن واختر Show Tables - إظهار جداول ، وذلك بالشكل التالي :
والآن قم باختيار الجداول واحداً تلو الآخر واضغط Add - اضافة ، وبعد الانتهاء اختر Close - إغلاق .
سيظهر لك شكل كالتالي :
الآن من قائمة Relationships - العلاقات ، اختر تحرير علاقة - Edit Relationship . سوف تظهر لك شاشة اختر منها Create New .
سوف تظهر لك شاشة جديدة بالشكل التالي :
في خاصية Left Table Name اختر الجدول الذي سيكون مصدراً للبيانات وهو عندنا Tb_Main
وفي الجزء الأيمن اختر Tb_R1
وبالنسبة لخاصية Left Column Name اختر الحقل الذي سيكون رابطاً من الجدول الرئيسي ، ولذا سنختار Number
وفي الجزء الأيمن سيكون الحقل أيضاً هو Number .
وذلك بالشكل التالي :
قم الآن بالضغط على زر Ok وستظهر لك شاشة بالشكل التالي :
لاحظ ظهور نوع العلاقة في الجزء الأسفل من الشاشة .
أما بالنسبة لأزرار الاختيار :
1 - مربع الإختيار الأول : في هذا الخيار تحدد إذا ما كنت تريد منع المستخدم على ادخال حقل في الجدول الثاني دون أن يكون له نظير في الجدول الأول .
2 - مربع الإختيار الثاني : في هذا الخيار تحدد إذا ما كان تحديث بيانات الجدول الثاني عند تغيير قيم حقل المفتاح الرئيسي .
3 - مربع الإختيار الثالث : في هذا الخيار تحدد إذا ما كنت تريد حذف بيانات الجدول الثاني عند حذف نفس السجل في الجدول الرئيسي .
هناك زر آخر تحت اسم ( Join Type - نوع الدمج ) وبها ثلاث خيارات لأنواع مختلفة من الدمج .
والآن قم بالضغط على زر ( Create - إنشاء ) . ستلاحظ ظهور رسم لعلاقة بين الجدولين وذلك بالشكل التالي :
وبهذا نكون قد أنشأنا العلاقة الأولى من نوع One To One ... في العلاقة التالية سوف نستخدم المعالج .
للتأكد من عمل هذه العلاقة اذهب إلى Tb_Main وانقر علامة + الموجودة على يساره ... أتمنى أن يظهر لديك الشكل التالي :
سوف نقوم الآن بإنشاء العلاقة الخاصة بالسنة الدراسية ... لذا سوف نتجه إلى جدول TB_Main ونضغط Design ومن ثم نذهب إلى الحقل Year ونختار Lookup Wizard ، وذلك بالشكل التالي :
أول شاشة تظهر لنا تخيرنا فيما إذا ما كنا نريد أن نختار جدولاً لننشأ معه علاقة ، أم نريد أن نضع قيم ... سوف نترك الخيار الافتراضي وهو الأول ونضغط على التالي .
الشاشة التالية سوف تطلب منا اختيار الجدول الذي نريد إنشاء علاقة معه ، وسنختار Tb_R2 .
في الشاشة الثالثة سوف يطلب اسماء الحقول التي نريد لها أن تظهر في الجدول ... سوف نختار Year وذلك بالشكل التالي :
ومن ثم نضغط على التالي .
في الشاشة التالية سوف يظهر لنا بيانات الحقل المختار الموجودة حالياً في الجدول الذي اخترناه ، لذا سوف نختار التالي .
أخيراً سوف نختار اسم الحقل الذي نريد له أن يظهر العلاقة ، وسنتركه على ما هو عليه ، ونختار Finish - إنهاء .
سيخبرك أن الجدول لا بد أن يحفظ أولاً قبل القيام بضبط العلاقة ... قم بالحفظ ، ومن ثم أغلق شاشة التصميم .
الآن قم بتشغيل الجدول واختر الحقل Year ولاحظ ظهور قيم الجدول الثاني في قائمة وبإمكانك الاختيار منها مباشرة ... وذلك بالشكل التالي :
أيضاً اختر الجدول Tb_R2 وانقر علامة + سيظهر لك جميع الطلبة الذين ينتمون إلى هذه السنة وذلك بالشكل التالي :
أخيراً سوف نلقي نظرة على شاشة العلاقات التي قمنا بتشغيلها في الدرس السابق ... سوف يظهر لك شكل قريب من التالي :
الملف المرفق يحتوي على جميع العلاقات اضافة إلى جميع محتويات الدروس السابقة ، والله الموفق ...
http://www.c4arab.com/images/lessons/databases/general/cpic/db5.zip