تقنية

تناقض الحقول المرتبطة: لماذا قد ينجح كل حقل منفردا ويفشل السجل؟

أعداد ثلاثة ألوان تعطي تسعا وتقارن بعدد كلي مسجل هو 8 عند تحقق شروط الفئات ووحدة الرصد
رسم أصلي يوضح تعارض علاقة حسابية رغم قبول المجالات المنفردة؛ لا يحدد الرقم الحقيقي.

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

الخلاصة السريعة

اكتب العلاقة المطلوبة بين الحقول، وتحقق من شروط الجمع وتوفر المعلومات، ثم افحص السجل وفقها.

  • قد تقبل المجالات المنفردة 3 و5 و1 والعدد8، بينما يساوي مجموع الألوان 9؛ تحتاج العلاقة بين الحقول إلى فحص مستقل.
  • يشترط مثال الجمع فئات شاملة لا تتداخل، ووحدة عد واحدة، وعلبة ووقت رصد واحدين؛ دون ذلك قد تكون المساواة غير مطلوبة.
  • افصل نقص المعلومات عن تعارض قيم موجودة؛ CHECK في SQLite لا يعد نتيجة NULL مخالفة، فلا يغني وحده عن اشتراط القيم المطلوبة. [1]
  • راجع البيانات المستلمة مباشرة؛ يراجع SQLite قيود CHECK عند الكتابة، ويمكن تعطيلها، ولا تفحص القراءة العادية القيود. [1]

لماذا قد تنجح قواعد كل حقل؟

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

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

ما الشروط التي تجعل الجمع مناسبا؟

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

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

كيف نعالج المعلومات الناقصة؟

في SQLite، يخالف تعبير CHECK القيد إذا كانت نتيجته صفرا؛ أما نتيجة NULL فلا تعد مخالفة لهذا القيد. [1]

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

هل وجود قيد يفحص الملف المستلم؟

توضح SQLite أن CHECK يفحص عند الكتابة، ويمكن تعطيله بـ ignore_check_constraints، وأن الاستعلامات لا تتحقق من القيود عادة. [1]

نقترح فحص نسخة البيانات المستلمة بعلاقة موثقة بدلا من الاكتفاء بعبارة «في المصدر قيد». نحفظ القيم التي أظهرت المشكلة، ومعرف السجل ونسخة القاعدة وشروطها. ثم نراجع المصدر لتحديد التصحيح المناسب؛ لا نغير العدد الكلي إلى9 لمجرد إزالة التنبيه.

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

المصادر ومتابعة القراءة

  1. SQLite: CREATE TABLE — CHECK constraints (يفتح في نافذة جديدة)sqlite.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.