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 |
في الدرس التالي ستتعرفى على أنواع العلاقات بين الجداول.
من بعدها ستتعلم طريقة ربط القيم المشتركة و الموزعة على عدة جداول عند استرجاعها.