اذهب إلى المحتوى

السؤال

Recommended Posts

  • 2
نشر

السبب بسيط وهو أنه لا يمكن للمفتاح الرئيسي أو ما يعرف بprimary key أن يتكرر وهو حقل فريد أي لا يمكن ان تتكرر قيمته, بمعنى آخر لن تجد مستخدمين لهما نفس قيمة primary key, بينما من الممكن ان يتم تكرار الاسم, فمثلا من الممكن أن يكون المستخدم الأول اسمه محمد, والثاني أيضا اسمه محمد, تخيل لو اعتمدنا على الاسم في هذه الحالة, البيانات المسترجعة لأي مستخدم سوف تكون؟ لذلك دائما نعتمد على حقل نكون متأكدين ان قيمته لن تتكرر لكي نسترجع البيانات بشكل صحيح, يمكنك الاعتماد على الايميل أو اسم المتسخدم او أي حقل تكون متأكد انه لن يتكرر , لا مشكلة في ذلك بالتأكيد, الفكرة ليس دائما في استخدام primary key , بل أن نقوم بالاستعلام باستخدام حقل لن تتكرر قيمته بين البيانات

  • 1
نشر

هذا لأن قاعدة البيانات عند بحثها عن حقول من الindex  يكون الأمر مختلفًا عن بحثها عن حقول عادية, والprimary key و الunique يعدون من الindexes

ولكن كيف يختلف البحث  ؟ عندما تقوم بتخزين تسجيل ما فإن قاعدة البيانات تضع قيمة الindex الخاص بهذا التسجيل بداخل هيكل بيانات من نوع الhash table  (ليس جميع قواعد البيانات يستخدمون نفس نوع هيكل البيانات فبعضهم يستخدم الbinary tree ولكن حتى تفهم جيدا فلنتعامل مع الHash table)

والhash table هو عبارة عن مصفوفة ولكن بدلا من الوصول إلى العنصر بإستخدام ترتيبه نعصر عليه بإستخدام الkey 

فمثلا

hash_table[
"sharaf":"ashraf",
"mahmoud":"hossam"
]

الhash table هذا يخزن مفتاح sharaf ويحمل قيمة ashraf 
كيف يتم هذا التخزين؟ يتم إجراء عملية hashing للمفتاح ويتم وضع القيمة المرتبطة بالمفتاح في الذاكرة عند العنوان الناتج من عملية الhashing التي تتم للمفتاح, فإذا ان كان لدينا قيمة اي مفتاح في الجدول نستطيع أن نصل إلى قيمته لحظيًا بدون إجراء بحث لأننا بالفعل نمتلك عنوانه في الذاكرة (قيمة الhashing لهذا المفتاح)

بالتالي عندما تقوم بتخزين سجل ما في قاعدة البيانات يتم بيانات هذا السجل كقيمة للمفتاح المسمى على إسم الindex

فبالتالي عندمة تقوم بالبحث عن سجل بإستخدام الindex تحصل على السجل لحظيًا, على عكس باقي الحقول التي تعطيك قيمة السجل بعد إجراء عملية بحث على جميع السجلات في الجدول

  • 1
نشر

نعم يمكنك الاستعلام عن البيانات عن طريق أي حقل أو مجموعة من الحقول الأخرى التي تريدها دون الحاجة لوجود مفتاح أساسي، لكن قد تواجهك المشاكل التالية:

  • التأكد أن توليفة الحقول التي ستستعلم بها مميزة لكل عنصر داخل الجدول (يمكن للخاصية Unique أن تساعدك على ضمان ذلك)
  • مع الوقت قد يطرأ تغيير على قيمة الحقل، الحقول التي ستختارها سيتم الاشارة اليها في جداول اخرى للربط بين العناصر ويجب عندها المرور على كل ذكر للقيمة في الجداول الأخرى والتأكد من تغييرها للقيمة الجديدة
  • اذا اخترت حقل اسم المستخدم مع الوقت قد تدخل ميزة حذف حساب مستخدم مع ابقاء بياناته ضمن قاعدة البيانات (مثلا باضافة حقل is_deleted)، ما يعني السماح للمستخدمين الجدد باستعمال اسم مستخدم محذوف، ولكن لن يتم السماح بتكرار اسم مستخدم جديد يماثل اسم مستخدم موجود سابقا (ولو كان محذوف بالنسبة لتطبيقك)
  • التأكد من فهرسة الحقول المميزة التي اخترتها لزيادة سرعة جلب البيانات

للتخلص من كل هذه المشاكل نضيف مفتاح رئيسي عبارة عن حقل إضافي بدون معنى، مهمته فقط تمييز كل عنصر داخل الجدول بطريقة مجردة لا تتغير مهما تغيرت ميزات تطبيقك نسميه primary key عبارة عن عدد متزايد (أو أي قيم عشوائية مميزة أخرى)

  • 0
نشر

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

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

و يعني هذا أنه بجانب أن المفاتيح الرئيسية سهلة في الإستعلام و فريدة و غير مكررة هي ضرورية جدا أيضا إذا كان الجدول مؤهلاً كجدول علائقي , أي أن يكون جدول يرتبط بغيره من الجداول بعلاقة ما . أي أنه له دورا علائقيا أيضا .

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

أي أنه له بجانب دوره التبسيطي , و العلائقي دورا ترتيبيا و منطقيا أيضا . 

و لنأخذ على سبيل المثال , تطبيقات السجلات . فمن غير المنطقي طبعا أن يتغير ترتيب السجل كل مرة يتم فيها إدخال حقل جديد .

فكل هذا يؤول إستخدام المفاتيح الرئيسية في أغلب الإستعلامات .

و طبعا كل هذا لا يعني هذا الإستغناء عن باقي الأعمدة و الإكتفاء بالإستعلام عن البيانات بمفتاح رئيسي , فقد نحتاج في كثير من الحالات الإستعلام عن البيانات عن طريق أعمدة أخرى من مثل الإستعلامات التي يتم كتابتها في عمليات البحث و الفهرسة . 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...