أهم أقسام المدونة

الصفحات

الجمعة، 22 أبريل 2016

قواعد البيانات المترابطة Relational Databases


قواعد البيانات المترابطة 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).

هنا يجب أن نتعرف على المصطلحات التالية:

- تسمى قاعدة البيانات التي توجد علاقات بين جداولها بقاعدة البيانات المترابطة Relational Database

- يسمّى الحقل المشترك في كلا الجدولين "حقلا مفتاحيا" Key field.

- يسمّى الحقل ID في جدول المؤلفين باسم "المفتاح الأساسيّ" Primary Key، وذلك لأنه متفرّد Unique غير قابل للتكرار (يجب ألا يتكرر نفس المفتاح لأكثر من مؤلف).. ولا يحتوي الجدول على أكثر من مفتاح أساسيّ واحد.

- يسمّى الحقل AuthorID في جدول الكتب باسم "المفتاح الفرعيّ" أو "المفتاح الدخيل" Foreign Key، لأنّه موضوع في هذا الجدول ليربطه بجدول آخر.. ويمكن أن تتكرّر بعض القيم في خانات هذا العمود بدون أدنى مشكلة (كما في حالة وجود أكثر من كتاب لنفس المؤلف).. ويمكن أن يحتوى الجدول على أكثر من مفتاح فرعيّ تربطه بعدد من الجداول الأخرى (كأن يحتوي جدول الكتب على المفتاحين الفرعيين AuthorID و PublisherID).

- يسمّى جدول المؤّلفين باسم "الجدول الرئيسيّ" Master، وجدول أسماء الكتب باسم "جدول التفاصيل" Details، حيث يمكنك أن تحصل منه على معلومات عن الكتب المتوافرة لكل مؤلف.. وتسمى العلاقة بين الجدولين بعلاقة Master-Details.

- تسمّى عمليّة مطابقة الصفوف بين الجدولين المترابطين باستخدام الحقل المفتاحيّ، بعملية "الربط" Join.. كأن تحاول معرفة اسم مؤلف كتاب معيّن، أو أن تحاول أن تعرف كل الكتب التي كتبها نفس المؤلف.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET

للتنزيل من مكتبة الكتب العربية برابط مباشر:


 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.