فهم حدود SQL

0 الأسهم
0
0
0
0

مقدمة

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

تتيح لك أنظمة إدارة قواعد البيانات العلائقية (RDBMS) التحكم في البيانات المضافة إلى جدول باستخدام القيود. القيد هو قاعدة خاصة تُطبق على عمود واحد أو أكثر - أو على الجدول بأكمله - وتحد من التغييرات التي يمكن إجراؤها على بيانات الجدول، عبر عبارة. إدراج، تحديث، أو يمسح إنه يحد.

تتناول هذه المقالة بالتفصيل القيود وكيفية استخدامها في أنظمة إدارة قواعد البيانات العلائقية. كما تتناول كل قيد من القيود الخمسة المحددة في معيار SQL، وتشرح وظائفه.

ما هي القيود؟

في لغة SQL، القيد هو أي قاعدة تُطبّق على عمود أو جدول تُقيّد البيانات التي يُمكن إدراجها فيه. عند محاولة إجراء أي عملية تُغيّر البيانات المُخزّنة في الجدول - مثل عبارة INSERT أو UPDATE أو DELETE - يختبر نظام إدارة قواعد البيانات العلائقية ما إذا كانت هذه البيانات تُخالف القيود الحالية، وفي هذه الحالة، يُعيد خطأً.

غالبًا ما يعتمد مسؤولو قواعد البيانات على القيود لضمان التزام قاعدة البيانات بمجموعة محددة من قواعد العمل. في سياق قواعد البيانات، تُعرّف قاعدة العمل بأنها أي سياسة أو إجراء تتبعه شركة أو مؤسسة أخرى، ويجب على بياناتها الالتزام بها. على سبيل المثال، لنفترض أنك تُنشئ قاعدة بيانات تُفهرس مخزون متجر أحد العملاء. إذا حدد العميل رقم تعريف فريدًا لكل سجل منتج، يمكنك إنشاء عمود بقيد "فريد" يضمن عدم تطابق أي مدخلين في ذلك العمود.

تُعدّ القيود مفيدةً أيضًا للحفاظ على سلامة البيانات. سلامة البيانات مصطلحٌ عامٌ يُستخدم غالبًا لوصف الدقة والاتساق والعقلانية العامة للبيانات المُخزّنة في قاعدة البيانات، بناءً على حالات استخدامها المُحدّدة. غالبًا ما تكون الجداول في قاعدة البيانات مُرتبطة، وتعتمد أعمدة أحد الجداول على قيم جدول آخر. ولأن إدخال البيانات غالبًا ما يكون عُرضةً للخطأ البشري، فإن القيود مُفيدةٌ في مثل هذه الحالات، إذ تضمن عدم تأثير أي بيانات مُدخلة بشكلٍ خاطئ على هذه العلاقات، وبالتالي المساس بسلامة بيانات قاعدة البيانات.

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

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

يحدد معيار SQL رسميًا خمسة قيود فقط:

  • المفتاح الأساسي
  • المفتاح الأجنبي
  • فريد
  • مراجعة
  • إنه ليس فارغا.

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

المفتاح الأساسي

يتطلب قيد المفتاح الأساسي أن يكون كل إدخال في عمود معين فريدًا وليس NULL، مما يسمح لك باستخدام هذا العمود لتحديد كل صف فردي في الجدول.

في النموذج العلائقي، المفتاح هو عمود أو مجموعة أعمدة في جدول، حيث تضمن كل قيمة فريدة وخالية من أي قيم فارغة. المفتاح الأساسي هو مفتاح خاص تُستخدم قيمه لتحديد صفوف الجدول، ويمكن استخدام العمود أو الأعمدة التي تُشكل المفتاح الأساسي لتحديد الجدول في بقية قاعدة البيانات.

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

يمكنك إنشاء مفتاح أساسي في SQL باستخدام قيد "المفتاح الأساسي"، وهو مزيج من قيدي "فريد" و"ليس فارغًا". بمجرد تعريف المفتاح الأساسي، يُنشئ نظام إدارة قواعد البيانات فهرسًا مرتبطًا به تلقائيًا. الفهرس هو بنية قاعدة بيانات تُسهّل استرجاع البيانات من الجدول. وكما هو الحال في الفهرس في الكتب الدراسية، لا تحتاج الاستعلامات إلا إلى فحص مدخلات العمود المفهرس للعثور على القيم المرتبطة به. وهذا ما يسمح للمفتاح الأساسي بالعمل كمعرّف لكل صف في الجدول.

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

  • معرف الطالب:تستخدم لتخزين رقم التعريف الفريد لكل طالب
  • الاسم الأول:تستخدم لحفظ الاسم الأول لكل طالب
  • اسم العائلة:تستخدم لحفظ الاسم الأخير لكل طالب

من الممكن أن يتشارك بعض الطلاب في المدرسة الاسم الأول، مما يجعل عمود "الاسم الأول" خيارًا غير مناسب للمفتاح الأساسي. وينطبق الأمر نفسه على عمود "الاسم الأخير". قد يكون المفتاح الأساسي المكون من عمودي "الاسم الأول" و"الاسم الأخير" مناسبًا، ولكن لا يزال هناك احتمال أن يتشارك طالبان الاسم الأول والأخير.

يمكن استخدام مفتاح أساسي يتكون من معرف الطالب وعمودي "الاسم الأول" أو "اسم العائلة"، ولكن بما أن رقم تعريف كل طالب فريد بالفعل، فإن تضمين كل عمود من أعمدة الاسم في المفتاح الأساسي يُعدّ أمرًا زائدًا عن الحاجة. لذا، في هذه الحالة، فإن الحد الأدنى من السمات التي تُعرّف كل صف، وبالتالي يُعدّ خيارًا جيدًا للمفتاح الأساسي للجدول، هو عمود "معرف الطالب" وحده.

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

المفتاح الأجنبي

يتطلب قيد المفتاح الأجنبي أن يكون كل إدخال في عمود معين موجودًا بالفعل في عمود محدد من جدول آخر.

إذا كان لديك جدولان ترغب في ربطهما، فيمكنك تحديد مفتاح خارجي باستخدام قيد "المفتاح الخارجي". المفتاح الخارجي هو عمود في أحد الجدولين (الجدول الفرعي) تأتي قيمه من مفتاح في جدول آخر (الجدول الرئيسي). هذه طريقة للتعبير عن علاقة بين جدولين: يشترط قيد "المفتاح الخارجي" أن تكون قيم العمود الذي ينطبق عليه موجودة في العمود الذي يشير إليه.

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

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

في أغلب الأحيان، يكون المفتاح الخارجي للجدول هو المفتاح الأساسي للجدول الرئيسي، ولكن ليس هذا هو الحال دائمًا. في معظم أنظمة إدارة قواعد البيانات العلائقية، يمكن الإشارة إلى أي عمود في الجدول الرئيسي يحتوي على قيد "فريد" أو "مفتاح أساسي" بواسطة المفتاح الخارجي للجدول الفرعي.

فريد

يمنع القيد الفريد إضافة أي قيم مكررة إلى العمود المحدد.

كما يوحي الاسم، يتطلب قيد "فريد" أن يكون كل مُدخل في عمود مُحدد قيمة فريدة. أي محاولة لإضافة قيمة موجودة مُسبقًا في العمود ستؤدي إلى خطأ.

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

  • یک به یکيقال أن هناك علاقة واحد لواحد بين جدولين إذا كانت الصفوف في الجدول الرئيسي تتوافق مع صف واحد فقط في الجدول الفرعي.
  • واحد إلى كثيرفي علاقة من العديد إلى أي، يمكن أن يرتبط صف في الجدول الرئيسي بصفوف متعددة في الجدول الفرعي، ولكن يمكن أن يرتبط كل صف في الجدول الفرعي بصف واحد فقط في الجدول الرئيسي.
  • كم عدد؟:إذا كان من الممكن ربط الصفوف في الجدول الرئيسي بصفوف متعددة في الجدول الفرعي والعكس صحيح، يقال أن الاثنين لديهما علاقة متعدد إلى متعدد.

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

لاحظ أنه يمكنك تعريف قيود فريدة على مستوى الجدول والعمود. عند تعريفها على مستوى الجدول، يمكن تطبيق القيد الفريد على أكثر من عمود. في هذه الحالات، يمكن أن يحتوي كل عمود في القيد على قيم مكررة، ولكن يجب أن يحتوي كل صف على مجموعة فريدة من القيم في الأعمدة المقيدة.

مراجعة

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

تُكتب مُسندات قيد CHECK كتعبيرات يمكن تقييمها إما بـ TRUE أو FALSE أو ربما بـ null. إذا حاولت إدخال قيمة في قيد CHECK، وتسببت هذه القيمة في تقييم العبارة بـ TRUE أو بـ null (وهو ما يحدث للقيم NULL)، فستنجح العملية. أما إذا تم تقييم التعبير بـ FALSE، فستفشل العملية.

غالبًا ما تعتمد مُسندات CHECK على مُعامل مُقارنة رياضي (مثل <، >، <=، أو >=) لتقييد نطاق البيانات المسموح بها في عمود مُعين. على سبيل المثال، من الاستخدامات الشائعة لقيود CHECK منع الاحتفاظ بالقيم السالبة في بعض الأعمدة في الحالات التي لا يكون فيها استخدام القيمة السالبة منطقيًا، كما في المثال أدناه.

تُنشئ عبارة CREATE TABLE هذه جدولاً باسم productInfo، يحتوي على أعمدة لاسم كل منتج ورقم تعريفه وسعره. ولأنه من غير المنطقي أن يكون سعر المنتج سالباً، تُطبّق هذه العبارة قيد CHECK على عمود السعر لضمان احتواءه على قيم موجبة فقط:

CREATE TABLE productInfo (
productID int,
name varchar(30),
price decimal(4,2)
CHECK (price > 0)
);

يجب ألا يستخدم أي مُسند تحقق مُعامل مقارنة رياضي. عادةً، يُمكنك استخدام أي مُعامل SQL يُمكن تقييمه إلى "صحيح" أو "خطأ" أو "غير معروف" في مُسند تحقق، بما في ذلك "LIKE" و"BETWEEN" و"IS NOT NULL" وما إلى ذلك. بعض تطبيقات SQL، وليس كلها، تسمح لك بتضمين استعلام فرعي في مُسند تحقق. مع ذلك، يُرجى مُلاحظة أن مُعظم التطبيقات لا تسمح لك بالإشارة إلى جدول آخر في جملة.

إنه ليس فارغا.

يمنع القيد NOT NULL إضافة أي قيم NULL إلى العمود المحدد.

في معظم تطبيقات SQL، إذا أدرجتَ صفًا من البيانات دون تحديد قيمة لعمود معين، فسيُمثّل نظام قاعدة البيانات البيانات المفقودة افتراضيًا بـ NULL. في SQL، NULL هي كلمة رئيسية خاصة تُستخدم لتمثيل قيمة مجهولة أو مفقودة أو غير محددة. مع ذلك، فإن NULL ليست قيمة بحد ذاتها، بل هي حالة قيمة مجهولة.

لتوضيح هذا الاختلاف، تخيّل جدولاً يُستخدم لتتبع العملاء في وكالة توظيف، ويحتوي على عمودين للاسم الأول والأخير لكل عميل. إذا استخدم العميل اسمًا واحدًا - مثل "شير" أو "آشر" أو "بيونسيه" - فقد يُدخل مسؤول قاعدة البيانات اسمًا واحدًا فقط في عمود الاسم الأول، مما يُؤدي إلى إدراج نظام إدارة قواعد البيانات قيمة NULL في عمود اسم العائلة. لا تُعتبر قاعدة البيانات اسم عائلة العميل "فارغًا" حرفيًا، بل تعني فقط أن قيمة عمود اسم العائلة لهذا الصف غير معروفة أو أن الحقل لا ينطبق على هذا السجل تحديدًا.

كما يوحي الاسم، يمنع قيد "ليس فارغًا" أي قيمة في العمود المحدد من أن تكون فارغة. هذا يعني أنه بالنسبة لأي عمود يحتوي على قيد "ليس فارغًا"، يجب تحديد قيمة له عند إدراج صف جديد. وإلا، ستفشل عملية الإدراج.

نتيجة

تُعد القيود أداةً أساسيةً لأي شخص يتطلع إلى تصميم قاعدة بيانات تتمتع بمستوى عالٍ من سلامة البيانات وأمانها. بتقييد البيانات المُدخلة في عمود، يمكنك ضمان الحفاظ على العلاقات بين الجداول بشكل صحيح، والتزام قاعدة البيانات بقواعد العمل التي تُحدد غرضها.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

قد يعجبك أيضاً