Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

SQLكيف يتم ربط الجداول مع بعضها

  • لما لا نضع كل بيانات المشروع بداخل جدول واحد؟
  • كيف يتم ربط الجداول مع بعضها؟
  • فوائد ربط الجداول مع بعضها
  • طريقة ربط القيم الموضوعة في عدة جداول عند استرجاعها

لما لا نضع كل بيانات المشروع بداخل جدول واحد؟

لنفترض أنك تريد تخزين معلومات الزبائن و طلبياتهم في جدول واحد. لاحظ كم سيكون هناك حقول فارغة و قيم متكررة في كل سطر.

person_id first_name last_name order_number product_1_name product_1_price product_2_name product_2_price product_3_name product_3_price
1 Ahmad Alhazem NULL NULL NULL NULL NULL NULL NULL
1 Ahmad Alhazem 100 Computer Screen 160 NULL NULL NULL NULL
1 Ahmad Alhazem 215 Keyboard 10 Mouse 7 NULL NULL

بشكل عام، تصميم الجدول بهذا الشكل سيئ جداً لأنه يحتوي على حقول كثيرة فارغة و قيم مكررة في كل سطر.

التصميم أعلاه يتضمن مشاكل أخرى قد لا تدركها الآن و هي:

  • إذا أردت تحديث أي معلومة، يجب عليك تحديثها في جميع الأسطر المذكورة فيها
  • استهلاك مساحة تخزين أكبر من الحاجة الفعلية.
  • إستجابات الخادم ستصبح بطيئة جداً في عمليات البحث، التحديث و الحذف.
  • ستفقد بعض الميزات، فعلى سبيل المثال لا يمكنك جعل قيم العمود موحدة لأنه يجب إعادة تكرارها نفسها في أكثر من سطر.

لا تفكر إطلاقاً بوضع كل بيانات المشروع بداخل جدول واحد, بل فكر دائماً بأن عليك توزيع بيانات المشروع على عدة جداول بشكل منطقي و مرتب.

كيف يتم ربط الجداول مع بعضها؟

لربط البيانات الموضوعة في الجدول مع البيانات الموضوعة في جدول آخر، عادةً ما نعتمد على العمود الذي يمثل المفتاح الأساسي أو العمود الذي يحتوي قيم موحدة (أي لا يوجد فيها أي تكرار) الموجود في الجدول الآخر.

لنفترض أننا نريد تخزين بيانات المستخدمين و نريد معرفة بلد كل واحد منهم. هنا لتجنب تكرار أسماء البلدان، يجب تخزين البلدان في جدول خاص. و بعدها نستطيع تخزين رقم تعرفة البلد فقط عند المستخدمين كما يلي.

كيف يتم ربط الجداول مع بعضها؟

لاحظ أن كل سطر في الجدول countries يملك رقم id خاص به، أي كل بلد يملك رقم تعرفة خاص به.
العمود country_id في الجدول users يستخدم قيم العمود id الموجودة في الجدول countries للإشارة إلى بلدان المستخدمين.


معلومات الجدول countries نقرؤها كالتالي

  • البلد رقم 1 هو لبنان Lebanon و عملته الليرة اللبنانية Lebanese Pound.
  • البلد رقم 2 هو عمان Oman و عملته الريال العماني Omani Riyal.
  • البلد رقم 3 هو مصر Egypt و عملته الجنيه المصري Egyption Pound.

إذاً أصبحنا قادرين على معرفة البلد من خلال رقم التعرفة id الخاص به.


معلومات الجدول users نقرؤها كالتالي

  • المستخدم رقم 1 إسمه Ahmad Eid و هو من الدولة التي رقم تعرفتها يساوي 1 و التي هي Lebanon.
  • المستخدم رقم 2 إسمه Ramez Morad و هو من الدولة التي رقم تعرفتها يساوي 2 و التي هي Oman.
  • المستخدم رقم 3 إسمه Hassan Mortada و هو من الدولة التي رقم تعرفتها يساوي 3 و التي هي Egypt.
  • المستخدم رقم 4 إسمه Saad Alkassem و هو من الدولة التي رقم تعرفتها يساوي 1 و التي هي Lebanon.
  • المستخدم رقم 5 إسمه Zaher Fahmi و هو من الدولة التي رقم تعرفتها يساوي 3 و التي هي Egypt.

فوائد ربط الجداول مع بعضها

من خلال العلاقة التي فعلناها بين الجدولين users و countries يمكننا ملاحظة الفوائد التالية.


1- التخلص من القيم المكررة

لا يوجد قيم مكررة في الجدولين users و countries.


2- تحديث القيمة مرة واحدة لجميع

إذا قمت بتحديث أي معلومة عادية في الجدول countries، فإنها ستتغير بشكل تلقائي بالنسبة كل جدول مرتبط به.

أي إذا قمنا بتحديث قيمة الحقل name و الحقل currency في الجدول countries فإنها ستتحدث بشكل تلقائي بالنسبة لكل مستخدم مرتبط بها في الجدول users حيث أن جميع المستخدمين في هذا الجدول مرتبطين برقم id البلد الثابت في الجدول countries و ليس بقيمه بشكل مباشر.

كيف تتحدث القيمة مرة واحدة عند الجميع


3- إضافة معلومات جديدة مرة واحدة للجميع

إذا قمت بإضافة عمود جديد في الجدول countries سيتم إضافته أيضاً بالنسبة لجميع المستخدمين في الجدول users.
فمثلاً، في حال قمنا بإضافة عمود جديد في الجدول countries إسمه symbol وضعنا فيه رمز عملة كل بلد على النحو التالي.

كيف تضاف المعلومات الجديدة عند الجميع

الآن بدون إجراء أي تعديل في الجدول users يمكننا القول أن رمز العملة في دولة المستخدم Ahmad Eid يجب عرضه له LBP.


4- الدقة في حفظ المعلومات

إذا تم تعيين العمود country_id كمفتاح أجنبي ( Foreign Key ) بالنسبة للعمود id الموجود في الجدول countries، عندها يصبح العمود country_id قادر على تخزين أعداد من العمود id الموجود في الجدول countries فقط.

في حالتنا يصبح العمود country_id قادر على أن يخزن الأعداد 1 و 2 و 3 فقط. مما يعني أنك إذا حاولت تخزين العدد 100 في الحقل country_id سيتم منعك من ذلك لأن الحقل id الموجود في الجدول countries لا يوجد فيه القيمة 100.

لا تقلق إن لم تفهم هذه الفكرة، لأنك ستدرس المفاتيح الأجنبية في درس لاحق.

طريقة ربط القيم الموضوعة في عدة جداول عند استرجاعها

عند حفظ البيانات، شاهدنا كيف أننا نحفظها في عدة جداول بشكل منطقي و مرتب و خالي من أي تكرار.
الآن قد تكون تتساءل كيف يمكن استرجاع البيانات كجدول واحد بعد أن تم توزيعها على جدولين!
ببساطة، عند جلب البيانات بواسطة الأمر SELECT نقوم بوضع أسماء الجداول التي سنحضر منها القيم و نذكر أسماء الأعمدة التي تربط الجداول باستخدام الكلمة ON فيقوم خادم قاعدة البيانات بتجميع القيم الموجودة في أكثر من جدول و إرجاعها لنا كجدول واحد.

كمثال بسيط، يمكنك دمج الجدولين users و countries في جدول واحد عند جلبها كما يلي.

id first_name last_name country
1 Ahmad Eid Lebanon
2 Ramez Morad Egypt
3 Hassan Mortada Oman
4 Saad Alkassem Lebanon
5 Zaher Fahmi Egypt

في الدرس التالي ستتعرفى على أنواع العلاقات بين الجداول.
من بعدها ستتعلم طريقة ربط القيم المشتركة و الموزعة على عدة جداول عند استرجاعها.