الأخبار

الدرس الأول : مقدمة فى قواعد البيانات

مقدمة فى قواعد البيانات للمبتدئين

البيانات DATA
هي الأرقام أو الحروف أو الرموز أو الكلمات القابلة للمعالجة بواسطة برامج الحاسب مثل: الرقم (65) أو كلمة بيانات.

المعلومات Information
هي بيانات تم تنظيمها أو معالجتها لتحقيق أقصى استفاده منها.

مثال:
الرقم (6) والرقم (5) إذا استخدما في عملية الضرب 5×6 أصبح الناتج (30) معلومه مفيدة.

قاعدة البيانات Data Base
هي تجميع لكمية كبيرة من المعلومات أو البيانات وعرضها بطريقة أو بأكثر تسهل الاستفادة منها.

مثال:
دليل التليفونات الذي يشتمل على أسماء وعناوين وأرقام تليفونات سكان مدينة الإسكندرية يمكن أن نعتبره قاعدة بيانات، وتتحقق الاستفادة من قاعدة البيانات هذه بإدخال رقم المشترك والحصول على اسمه وعنوانه أو إدخال اسم المشترك والحصول على رقم تليفونه وعنوانه وهكذا...

نظم إدارة قواعد البيانات Database Management Systems
هي مجموعه من البرامج الجاهزة التي تقوم بتنفيذ جميع الوظائف المطلوبة من قاعدة البيانات.

مثال:
بعد إضافة عملاء جدد لدليل التليفونات في مدينة الإسكندرية فإنك قد تحتاج لإعادة ترتيب أسماء المشتركين أبجدياً أو لترتيب عناوينهم، مثل هذا الإجراء من أحد وظائف إدارة قواعد البيانات.

أهمية قواعد البيانات
1.  تخزين البيانات لكافة الأنشطة لجهة ما بطرق متكاملة ودقيقه، وتصنيف وتنظيم هذه البيانات بحيث يسهل استرجاعها في المستقبل.
2.  متابعة التغيرات التي تحدث في البيانات المخزنة وإدخال التعديلات المطلوبة عليها، حتى تكون دائماً في الصورة الملائمة لاستخدامها فور طلبها.
3.  تخزين كم هائل من البيانات التي تتجاوز الإمكانيات البشرية في تذكر تفاصيلها، ومن ثم إجراء بعض العمليات والمعالجات التي يصعب تنفيذها يدوياً.
4.  تساعد على تخزين البيانات بطريقه متكاملة، بمعنى الربط بين النوعيات المختلفة للبيانات المعبرة عن كافة الأنشطة.
5.  تساعد على تحقيق السرية الكاملة للبيانات المخزنة بها بحيث لا تتاح أية معلومات لأي شخص ليس له الحق في الإطلاع عليها.

وظائف قواعد البيانات
1.    إضافة معلومة أو بيان جديد.
2.    حذف البيانات التي لم تعد هناك حاجة إليها.
3.    تغييرأو تعديل بيانات موجودة تبعاً لمعلومات استحدثت.
4.    البحث والاستمصطفى عن معلومة أو معلومات محددة.
5.    ترتيب وتنظيم البيانات.
6.    عرض البيانات في شكل تقارير أو نماذج منظمة.

أنواع قواعد البيانات
أ- من حيث الحجم:
(1) مشروعات صغيرة
(a)             Access
(b)            Paradox
(c)             FoxPro

(2) مشروعات كبيرة
(a)    Oracle
(b)   SQL (Structured Query Language(
(c)    DMS (Database Management System(
(d)   IDMS (Integrated Database Management System(
(e)    Informix
(f)     Sybase

ب- من حيث طريقة العمل:
(1) قواعد البيانات ذات شكل هرمي Hierarchy Databases
(2) قواعد بيانات شبكية Network Databases
(3) قواعد بيانات علائقية  Relational Databases

تنظيم البيانات داخل قاعدة البيانات:
تخزن المعلومات المطلوبة لقواعد البيانات داخل جداول Tables، كل جدول يشتمل على صفوف وأعمده، ويشتمل كل جدول على مجموعه من السجلات Records ويحتل كل سجل صفا داخل الجدول، ويقسم كل سجل إلى عدد من الحقول Fields .
إذا أردنا إعداد دليل تليفونات لسكان مدينة الإسكندرية، والجدول المطلوب يشتمل على البيانات التالية:
رقم المشترك، الاسم،  العنوان،  رقم التليفون
رقم المشترك
اسم المشترك
العنوان
رقم التليفون
1
محمد أحمد
سموحة
121212
2
أحمد ابراهيم
سيدى بشر
213212
3
ابراهيم محمود
المنتزه
454545


قواعد البيانات ذات العلاقات Relational databases
من المعروف أن طريقة تخزين البيانات في قواعد البيانات ذات العلاقات هي أن تكون البيانات مخزنة في صورة جداول مكونة من عدة سجلات (صفوف الجداول) كل سجل منها يحتوي على عدة حقول (أعمدة الجداول)
 
مثال على ذلك الجدول التالي:
الاسم
رقم التليفون
مدحت
223341
مصطفى
244211
سمير
299113
 
في المثال السابق هناك ثلاثة سجلات في الجدول كل منها مكون من معلومة مخزنة في أحد الحقلين الذين يعرّفان الجدول وهما الاسم ورقم التليفون.
والطريقة المثالية لاستخدام قواعد البيانات ذات العلاقات تقضي بعدة أمور من بينها:
  • الجداول مستطيلة الشكل.
  • يحتوي الحقل الواحد في السجل على مقطع واحدة من البيانات.
  • الطريقة الطبيعية لإضافة المعلومات إلى قاعدة البيانات أثناء استخدامها هي بإضافة سجلات جديدة إلى الجداول.
  • يجب أن لا تتكرر البيانات المخزنة في قاعدة البيانات.
وسنعرف حالا لماذا وضعت هذه الضوابط بالذات:
الجدول في المثال السابق يحقق كافة الضوابط التي ذكرناها، فهو مستطيل الشكل، والطريقة الطبيعية لإضافة المعلومات إليه هي إضافة سجلات جديدة يتكون كل منها من اسم للشخص الجديد ورقم تليفونه (أي معلومة واحدة لكل حقل)، كما أن تصميم الجدول لا يتطلب تكرار أية معلومات فيه.
لكن المشكلة التي سنحاول حلها الآن هي كيف يمكن تعديل الجدول لكي يسمح لنا بتخزين أكثر من رقم تليفون للشخص الواحد؟
لنفرض مثلا أن لمدحت ثلاثة أرقام تليفونات مختلفة، فكيف يمكن إضافة ثلاثة أرقام إلى الجدول؟
سنتناول لحل هذه المشكلة ثلاثة حلول خاطئة، ونبين جانب الخطأ في كل منها ونتحدث بعد ذلك عن الحل الصحيح.
الحل الأول: نضع أكثر من رقم في حقل التليفون ونفصل بينها بمصطفىة معينة.
 فيصبح الجدول كالتالي:
الاسم
رقم التليفون
مدحت
223341, 282212, 299432
مصطفى
244211
سمير
299113
بهذه الطريقة وضعنا ثلاثة أرقام بدلا من رقم واحد في حقل رقم التليفون للسجل الخاص بمدحت، وفصلنا بين الأرقام بمصطفىة الفاصلة.
لكننا نكون هنا قد أخللنا بأكثر من واحدة من ضوابط قواعد البيانات ذات العلاقة، فقمنا أولا بإضافة أكثر من مقطع بيانات في حقل واحد، وأصبح جدولنا غير مستطيل الشكل، لأن سجل مدحت أعرض بكثير من السجلين الآخرين، وإضافة بيانات جديدة إلى الجدول أصبحت تتم الآن بتعديل حقل رقم التليفون بدلا من إضافة سجلات جديدة.
الحل الثاني: نضيف أكثر من سجل للشخص نفسه، بحيث يمكن أن يحتوي كل سجل على رقم تليفون مختلف
فيصبح جدولنا بذلك كالتالي:
الاسم
رقم التليفون
مدحت
282212
مدحت
223341
مدحت
299432
مصطفى
244211
سمير
299113
في الجدول السابق قمنا بمخالفة قاعدة أخرى وهي أنه أصبح لدينا الآن معلومة مكررة، وهي اسم مدحت، كما أنه بالنسبة لقاعدة البيانات في هذه الحالة، لا توجد أية علاقة بين مدحت الأول والثاني والثالث، ولن تعرف أبدا بأنه الشخص نفسه.
والمشكلة في ذلك هي أنك إذا أردت مثلا أن تغير اسم مدحت وتضع اسمه الكامل مدحت الباشا، فانك يجب أن تتذكر القيام بذلك ثلاثة مرات، مرة لكل واحدة من الأرقام الثلاثة، كما أنك إذا أنهيت علاقتك بمدحت وأردت حذف أرقامه، فان عليك حذف كل رقم على حده.
الحل الثالث: نضع كل رقم من أرقام مدحت في خانة منفصلة
فيصبح جدولنا بذلك كالتالي:
الاسم
رقم التليفون1
رقم التليفون2
رقم التليفون3
مدحت
223341
282212
299432
مصطفى
244211


سمير
299113


لكننا خالفنا القواعد هنا أيضا، فجدولنا ليس مستطيل الشكل الآن، كما أن إضافة بيانات إلى الجدول تتم الآن بتعديل السجلات، ومشكلة أخرى تظهر هنا وهي ماذا لو أردنا أن نضع لمدحت رقم رابع؟ هل سنقوم بتعديل بنية الجدول بأكمله ونضيف خانة رابعة لرقم التليفون الرابع فقط لإضافة معلومة واحدة إلى أحد السجلات؟
لدينا سؤالان الآن :
  • ما هو الحل الصحيح الذي يتوافق مع ضوابط قواعد البيانات؟
  • لماذا يجب الالتزام بضوابط قواعد البيانات أصلا إذا كانت هذه الحلول كلها في النهاية تؤدي الغرض وتحقق المطلوب من برامجنا؟
وسنبدأ بالإجابة عن السؤال الثاني أولا:
لماذا يجب الالتزام بضوابط قواعد البيانات ذات العلاقة؟
والإجابة هي أن أنظمة وبرامج قواعد البيانات ذات العلاقة صممت بالأساس لتستخدم وفقا لهذه الضوابط، فقد صممت مثلا لتكون عملية إضافة سجلات جديدة إلى جدول ما أسرع بكثير من عملية تعديل بنية الجدول وإضافة حقل جديد إليه.
كما أنها صممت لتجعل البيانات تحتل أصغر مساحة ممكنة مع تحقيق أعلى سرعة ممكنة عندما تكون الجداول مستطيلة، لكن عندما تصبح الجداول غير مستطيلة ويكون هنالك تباين كبير في أحجام سجلاتها فإن البيانات ستحتل الكثير من المساحة الزائدة دون أن يكون هناك داع لذلك.
أضف إلى ذلك أن لغة SQL المستخدمة للتعامل مع قواعد البيانات صممت لكي تتعامل مع البيانات على هذا الأساس.
أما السؤال الأول: ما هو الحل الصحيح الذي يرضي ضوابط قواعد البيانات؟
فالإجابة عليه هي الهدف الأساسي من الموضوع، وبالإضافة إلى الإجابة عن هذا السؤال، سنعرف الإجابة عن سؤال آخر وهو: لماذا سمي هذا النوع من قواعد البيانات بقواعد البيانات ذات العلاقة؟
 
علاقة عدة بواحد (Many to One)
أول نوع من العلاقات التي سننظر إليها في مرورنا على كيفية تنظيم أنواع مختلفة من البيانات في قواعد البيانات ذات العلاقة هي علاقة تسمى عدة بواحد (Many to one).
مثال على هذا النوع من العلاقات هو العلاقة التي كنا نناقش كيفية تنظيمها في قاعدة البيانات سابقا، وهي اسم لشخص واحدة له عدة أرقام تليفون، فهناك عدة أرقام تليفونية مرتبطة باسم واحد ولذا سميت عدة بواحد (Many to one).
فها قد وصلنا أخيرا إلى الحل لمشكلتنا السابقة، وهو يكون باستخدام جدولين منفصلين، الأول للأسماء والثاني لأرقام التليفونات، كالتالي:
 
كود الشخص
الاسم
1
مدحت
2
مصطفى
3
سمير

كود الشخص
رقم التليفون
1
282212
1
223341
1
299432
2
244211
3
299113

في الجدول الأول، جدول الأشخاص، أضفنا حقلا جديدا هو حقل كود الشخص، كود الشخص في هذا الجدول هو عبارة عن رقم فريد لكل سجل يمكننا استخدامه للإشارة إلى سجل من هذه السجلات، فإذا قلت لك ما هو اسم الشخص الذي كوده 1 تقول لي مباشرة مدحت، وإذا سألتك عن اسم الشخص الذي كوده 3 تقول لي سمير، ولا يمكن أن يكون هنالك أكثر من سجل له نفس الكود، وهذا الرقم يسمى في اصطلاح قواعد البيانات ذات العلاقة المفتاح الأولي للجدول (Primary Key).
وفي الجدول الثانى نجد بأن هنالك حقلا يحمل نفس الاسم أيضا وهو كود الشخص، وهذا الحقل يحمل كود الشخص الذي يشير إليه الرقم، والهدف منه ببساطة هو أن نعرف لمن من الأشخاص يعود له الرقم المخزن في كل سجل، ففي السجل الأول من سجلات جدول أرقام التليفونات كان كود الشخص هو 1، أي أنه يعود إلى مدحت، وكذلك الأمر بالنسبة للسجل الثاني والثالث، فالأرقام الثلاثة الأول كلها تعود لمدحت أيضا، أما السجل الرابع فهو يحتوي على الرقم 2 في حقل كود الشخص، أي أنه يعود للشخص الذي كوده 2، وبالعودة إلى جدول الأشخاص نعرف بأنه مصطفى، وهكذا الأمر بالنسبة للحقل الخامس الذي يحمل رقم تليفون سمير.
ورقم الشخص في الجدول الثاني يسمى في اصطلاح قواعد البيانات ذات العلاقة بالمفتاح الأجنبي (Foreign Key)، وقد سمي بذلك لأن قيمته تشير إلى حقل أجنبي على الجدول، أي حقل من حقول جدول آخر.
وبهذه الطريقة أصبحت كل الجداول مستطيلة، كما أنه أصبح بإمكاننا إضافة أي عدد نريده من الأرقام لأي شخص ببساطة عن طريق إضافة سجل جديد إلى جدول أرقام التليفونات.
خلاصة ما سبق هي أن علاقة عدة بواحد (Many to One) تتم عن طريق ربط عدة سجلات في جدول ما بسجل واحد في جدول آخر عن طريق حقل في السجلات العدة يذكر المفتاح الأولي للعنصر الواحد.
 
 علاقة عدة بعدة (Many to Many)
الآن وبعد أن حللنا المشكلة السابقة، يمكننا الانطلاق قليلا بخيالنا لنحاول حل مشكلة أخرى مشابهة.
لنفرض بأننا نريد عمل قاعدة بيانات عن الكتب التي في مكتبتك، فقمت بعمل الجدول التالي:
الكتاب
المؤلف
المفاوضات السرية بين العرب واسرائيل
محمد حسنين هيكل
الترويج السياحي عبر الإنترنت
طارق العيثاوي
عام من الأزمات! 2000-2001
محمد حسنين هيكل
التجارة الالكترونية مبادئها ومقوماتها
يعقوب يوسف النجيدي،
فيصل محمد النعيم
لاحظ بأننا أخللنا باثنين من ضوابط قواعد البيانات، فقد قمنا بتكرار اسم محمد حسنين هيكل، كما أننا قمنا بوضع أكثر من معلومة في حقل المؤلف للسجل الأخير.
ولا يمكن حل هاتان المشكلتان بنفس الطريقة السابقة، والسبب في ذلك هو أنه في العلاقة السابقة (عدة بواحد) كان هناك عدة أرقام للشخص الواحد، لكننا لم نكن بحاجة لطريقة لتخزين عدة أشخاص لنفس الرقم، أما في هذا المثال الأخير، فإن الكتاب الواحد يمكن أن يكون له أكثر من مؤلف، والمؤلف الواحد يمكن أن يكون له أكثر من كتاب ولهذا السبب فإن هذه العلاقة تسمى علاقة عدة بعدة (Many to Many).
فلو قمنا بتقسيم الجدول إلى جدولين، واحد للكتب وواحد للمؤلفين، سنجد بأننا نحتاج لطريقة للربط بين عدة كتب لمؤلف واحد وعدة مؤلفين لكتاب واحد، وبالتالي فإن أي سجل من أي من الجدولين يمكن أن يرتبط بأكثر من سجل في الجدول الآخر.
ولحل هذه المشكلة نقوم أولا بتقسيم الجدول إلى جدولين منفصلين يحتوي كل منهما على مفتاح أساسي دون أن يحتوي أي منهما على مفتاح أجنبي، كالتالي:
 
كود الكتاب
الكتاب
1
المفاوضات السرية بين العرب واسرائيل
2
الترويج السياحي عبر الإنترنت
3
عام من الأزمات! 2000-2001
4
التجارة الالكترونية مبادئها ومقوماتها


كود المؤلف
المؤلف
1
محمد حسنين هيكل
2
طارق العيثاوي
3
يعقوب يوسف النجيدي
4
فيصل محمد النعيم
 
 وبعد القيام بذلك، نقوم بعمل جدول ثالث تكون وظيفته الربط بين الجدولين السابقين:
كود الكتاب
كود المؤلف
1
1
2
2
3
1
4
3
4
4
وكل من الحقلين كود الكتاب وكود المؤلف في جدول الربط هو عبارة عن مفتاح أجنبي، وبهذه الطريقة عندما أريد إضافة كتاب جديد إلى قاعدة البيانات فإنني أضيف اسم الكتاب إلى جدول الكتاب وبعد ذلك أضيف اسم المؤلف أو المؤلفين إلى جدول المؤلف إن لم تكن أسماؤهم قد أضيفت من قبل لكتب أخرى لهم، ثم أضيف سجلا يربط بين الكتاب والمؤلف أو المؤلفين في جدول الربط.
وبهذه الطريقة يمكنك بسهولة البحث عن أسماء مؤلفي كتاب معين، ويمكنك أيضا بسهولة البحث عن أسماء الكتب التي لمؤلف معين.
 
علاقة الابن بالأب (Sibling or Child to Parent) (أشجار البيانات) (Data Trees)
لنفرض أننا نريد عمل دليل بأنواع الكتب التي في مكتبتك، فقررت بأنك ستقسم الكتب أولا إلى عدة أقسام رئيسية يتفرع من كل قسم منها مجموعة من الأقسام الفرعية، فقمت بعمل جدول للأقسام الرئيسية وآخر للأقسام الفرعية وربطت الأقسام الفرعية بالرئيسية بعلاقة عدة بواحد.
لنفرض بأن الكتب ازدادت في مكتبك وازداد تنوعها، وظهرت لديك الحاجة لتقسيم الأقسام الفرعية مجددا إلى أقسام أدق منها. قد يكون الحل هو بإنشاء جدول جديد للأقسام المتفرعة عن الفرعية، لكن ماذا إذا أردت أن تتفرع أكثر فهل ستستمر بإضافة الجداول؟
كما أن هذه الطريقة تحتوي على مشكلة، وهي أن الكتب قد تكون أحيانا تحت الأقسام الرئيسية مباشرة، وأحيانا تحت الأقسام الفرعية وأحيانا تحت المتفرعة عن الفرعية، وهذا الأمر يعقد الأمور، لأننا في الحالة العادية سنربط الكتب بالأقسام بعلاقة عدة إلى واحد، ولتحقيق ذلك فإننا نحتاج إلى حقل في سجل الكتاب يكون عبارة عن المفتاح الأجنبي المرتبط بالمفتاح الرئيسي للقسم الذي يوجد تحته الكتاب، لكن المشكلة هي هل سنربط هذا المفتاح الأجنبي بالمفتاح الرئيسي لجدول الأقسام الرئيسية أم الفرعية أم المتفرعة عن الفرعية؟
والسبب في هذه المشكلة هي أننا قمنا بعمل أكثر من جدول لتخزين بيانات نفس النوع من العناصر، وهو الأقسام.
الحل لذلك يكون في دمج كل هذه الجداول في جدول واحد، ولكن كيف سنفرق بعد ذلك بين الأقسام الرئيسية والفرعية والمتفرعة عن الفرعية والمتفرعة عنها وهكذا؟
طريقة تحقيق ذلك تكون بإضافة حقل في سجل الأقسام يحدد القسم الأب لهذا القسم، وهذا الحقل ينشئ ما يسمى بعلاقة الابن بالأب في الجدول، أما الأقسام الرئيسية التي لا تتفرع عن أي قسم آخر فتوضع بها عادة القيمة (صفر) في حقل الأب.
وعلى فرض أن لدينا قسمان رئيسيان هما الكمبيوتر والطب، وتحت الكمبيوتر كان هنالك البرمجة وقواعد البيانات، وتحت البرمجة كان لديك لغة C ولغة PHP فإن جدولك سيكون كالتالي:
كود القسم
الأب
اسم القسم
1
0
الكمبيوتر
2
0
الطب
3
1
البرمجة
4
1
قواعد البيانات
5
3
لغة  C
6
3
لغة  PHP
كما نلاحظ فإن حقل الأب في قسمي الكمبيوتر والطب يحتوي على القيمة (صفر)، أي أنهما قسمان رئيسيان لا يتفرعان عن قسم أب، أما في سجلي البرمجة وقواعد البيانات فقد كان حقل الأب يحتوي على القيمة 1، أي أنهما يتفرعان عن السجل الذي مفتاحه الأولي هو 1 وهو قسم الكمبيوتر، وأما السجلين الأخيرين لغة C ولغة PHP فقد احتوى حقل الأب لهما على القيمة 3، وهي المفتاح الأولي لسجل البرمجة الذي يتفرعان عنه.
وهكذا يمكننا بسهولة إضافة قسم جديد تحت أي قسم آخر، ولأي عمق نريده، دون الحاجة لتغيير شيء في جداول قاعدة البيانات.