قواعد البيانات المترابطة Relational Databases:
لو لديك قاعدة بيانات للمكتبات ودور النشر، فسيحتوي جدول
الكتب Books على عدّة أعمدة لتخزين بعض المعلومات عن كل كتاب، مثل اسمه، وعدد صفحاته،
وموضوعه وسعره... إلخ.
يجب أيضا أن يحتوي جدول الكتب على معلومات عن مؤلف كل
كتاب، مثل اسمه ونبذة عنه وبريده الإلكتروني وهاتفه، ليستفيد بها الناشر عندما
يريد الاتصال به.. فكيف يا ترى نحفظ هذه المعلومات؟
بداهة، ليس من الذكي وضع كل هذه المعلومات في جدول
الكتب، لأنه سيحتوى بالتأكيد على أكثر من كتابٍ لنفس المؤلف، مما سيسبب المشاكل
التالية:
-
تكرار بيانات المؤلف أكثر من مرّة، مما يزيد من حجم قاعدة البيانات ويبطئ عمليّات
البحث.
-
إرهاق المستخدم الذي يدخل البيانات، بسبب كتابة بيانات نفس المؤلفين مرارا وتكرارا.
- احتمال حدوث خطأ في إدخال بيانات المؤلف المكررة، مما
يؤدي لتضارب في بيانات نفس المؤلف.
- عند تغير رقم هاتف المؤلف، يجب تعديل هذا في كل
سجلات الكتب!
عند البحث عن بيانات
المؤلف، سنحصل على أكثر من سجل بها نفس التفاصيل بلا فائدة!
والأمر نفسه بالنسبة لبيانات دار النشر التي نشرت
الكتاب، فمن المتوقع وجود مئات الكتب لكل دار نشر، ومن العبث تكرار معلومات مثل
اسم وعنوان وهاتف دار النشر، واسم الناشر أو مدير الدار مع كل كتاب!
إذن فما هو الحل المناسب لهذه المشكلة؟
كما ذكرنا من قبل، يجب إجراء عملية تطبيع Normalization لهذه البيانات، بتخصيص جدولٍ
للمؤلفين Authors يحتوى على سجل واحد لكل مؤلف لنحفظ فيه بياناته الأساسية، وجدول للناشرين Publeshers يحتوي على سجل واحد فقط لكل دار نشر لنحفظ فيه تفاصيلها،
مع ربط جدول الكتب بكل من هذين الجدولين.. دعنا نرى كيف نفعل هذا:
في جدول المؤلفين Authors سننشئ
عمودا للرقم المسلسل لكل مؤلف، اسمه ID.. وفي جدول الكتب Books سننشئ عمودا اسمه AuthorID، لنضع فيه رقم مؤلف كل كتاب.. فمثلا
لو كان رقم (توفيق الحكيم) في جدول المؤلفين هو 1، فإنّ الخانة AuthorID في جدول الكتب لا بدّ أن تكون 1 لكل من الكتب التالية:
"شهرزاد" و"الأيدي الناعمة" و"أرني الله"
و"شجرة الحكم"
كما هو موضح في الجدولين التاليين:
جدول المؤلفين Authors Table
ID
|
Author
|
Phone
|
eMail
|
About
|
1
|
توفيق الحكيم
|
-
|
-
|
-
|
2
|
عباس العقاد
|
-
|
-
|
-
|
3
|
محمد عبد الحليم عبد الله
|
-
|
-
|
-
|
4
|
نبيل فاروق
|
-
|
-
|
-
|
5
|
أحمد خالد توفيق
|
-
|
-
|
-
|
6
|
محمد حمدي
|
-
|
-
|
-
|
جدول الكتب Books Table
ID
|
Book
|
AuthorID
|
Pages
|
Price
|
1
|
أرني الله
|
1
|
200
|
500
|
2
|
يوميّات نائب في الأرياف
|
1
|
315
|
700
|
3
|
عصا الحكيم
|
1
|
150
|
350
|
4
|
سارة
|
2
|
270
|
500
|
5
|
عبقرية محمد
|
2
|
329
|
600
|
6
|
عبقرية عمر
|
2
|
280
|
600
|
7
|
شجرة اللبلاب
|
3
|
230
|
400
|
8
|
مهنتي القتل
|
4
|
100
|
200
|
9
|
الأفق الأخضر
|
4
|
110
|
200
|
10
|
أسطورة الغرباء
|
5
|
130
|
200
|
12
|
لا تدخلوا شيرود
|
5
|
178
|
250
|
13
|
مجرد طريقة للتفكير
|
6
|
60
|
100
|
14
|
حائرة في الحب
|
6
|
180
|
200
|
15
|
بين قوسين من الخلود
|
6
|
60
|
100
|
نفس الشيء يمكن فعله بالنسبة لجدول الناشرين Publishers، حيث سنضع فيه تفاصيل كل الناشرين، ونربط بينه وبين
جدول الكتب بإنشاء عمود اسمه PublisherID في جدول الكتب.
والآن،
دعنا نؤكد مرة أخرى فوائد هذه العملية:
1- توفير مساحة التخزين،
فبدلا من تكرار نفس بيانات المؤلفين والناشرين مع كل كتاب، صرنا نكرر فقط رقم
المؤلف ورقم الناشر.
2- تسريع عمليّة البحث.. فمثلا لو أردت البحث عن
كل كتب توفيق الحكيم في جدول الكتب، فسيكون البحث عن الرقم 1 في الحقل AuthorID
(وهو حقل عددي) أسرع بكثير من البحث في الحقل Author
(وهو حقل نصي) عن الاسم "توفيق الحكيم".. صحيح أننا
سنبحث في جدول المؤلفين أولا عن "توفيق الحكيم" للحصول على الرقم الخاص
به، لكن عدد الصفوف في جدول المؤلفين سيكون أقل بكثير من عدد الصفوف في جدول الكتب.
3- سهولة التعديل وتصحيح الأخطاء.. افترض مثلا أنّ
الموظف الذي يُدخل أسماء المؤلفين أخطأ وكتب الاسم "توفيق الحكيم"
كالتالي: "تفيق الحكيم".. في هذه الحالة ما عليه إلا أن يعدّل الخطأ
مرّة واحدة في جدول المؤلفين.. أمّا لو كانت أسماء المؤلفين موجودة في نفس جدول
الكتب، فإنّ تكرار كتابة اسم المؤلف يجعل احتمالات الخطإ أكبر، بالإضافة إلى تضييع
الوقت والجهد في كتابتها، ومشقة تعديلها كلها!
وعند استخدام هذا التنظيم، يقال إن هناك علاقةً Relationship بين جدولي الكتب والمؤلفين، حيث إنّ الرابط بينهما
هو رقم المؤلف (Authors.ID
و Books.AuthorID).. كما توجد علاقة بين جدول الناشرين وجدول الكتب، والرابط بينهما هو رقم الناشر (Publishers.ID و Books.PublisherID).
و Books.AuthorID).. كما توجد علاقة بين جدول الناشرين وجدول الكتب، والرابط بينهما هو رقم الناشر (Publishers.ID و Books.PublisherID).
هنا يجب أن نتعرف على المصطلحات التالية:
-
تسمى قاعدة البيانات التي توجد علاقات بين جداولها بقاعدة البيانات المترابطة
Relational Database
-
يسمّى الحقل المشترك في كلا الجدولين "حقلا مفتاحيا" Key field.
-
يسمّى الحقل ID في جدول المؤلفين باسم "المفتاح الأساسيّ" Primary Key، وذلك لأنه متفرّد Unique
غير قابل للتكرار (يجب ألا يتكرر نفس المفتاح لأكثر من مؤلف).. ولا يحتوي الجدول
على أكثر من مفتاح أساسيّ واحد.
-
يسمّى الحقل AuthorID في جدول الكتب باسم "المفتاح الفرعيّ" أو
"المفتاح الدخيل" Foreign Key، لأنّه موضوع في هذا الجدول
ليربطه بجدول آخر.. ويمكن أن تتكرّر بعض القيم في خانات هذا العمود بدون أدنى
مشكلة (كما في حالة وجود أكثر من كتاب لنفس المؤلف).. ويمكن أن يحتوى الجدول على
أكثر من مفتاح فرعيّ تربطه بعدد من الجداول الأخرى (كأن يحتوي جدول الكتب على
المفتاحين الفرعيين AuthorID و PublisherID).
-
يسمّى جدول المؤّلفين باسم "الجدول الرئيسيّ" Master، وجدول أسماء الكتب باسم "جدول
التفاصيل" Details، حيث يمكنك أن تحصل منه على معلومات عن الكتب
المتوافرة لكل مؤلف.. وتسمى العلاقة بين الجدولين بعلاقة Master-Details.
-
تسمّى عمليّة مطابقة الصفوف بين الجدولين المترابطين باستخدام الحقل المفتاحيّ،
بعملية "الربط" Join.. كأن تحاول معرفة اسم مؤلف كتاب
معيّن، أو أن تحاول أن تعرف كل الكتب التي كتبها نفس المؤلف.
من
كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET
للتنزيل
من مكتبة الكتب العربية برابط مباشر:
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.