تقنية

المفتاح الخارجي في البيانات: هل وجود المرجع يثبت صحة العلاقة؟

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

المفتاح الخارجي في البيانات يربط قيما في جدول بقيم مرجعية في جدول آخر. توضح وثائق SQLite أن القيد يفحص وجود صف مرجعي مطابق، مع معاملة خاصة للقيم null. وجود الصف لا يثبت وحده صحة العلاقة في الواقع. [1]

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

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

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

ما السؤال الذي يجيب عنه المرجع؟

تصف SQLite عمود الإشارة بأنه مفتاح ابن، والعمود المشار إليه بأنه مفتاح أب. [1]

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

كيف نميز مرجعا موجودا من مرجع مفقود؟

افترض أن جدولنا التعليمي يحتوي العلبتين ع4 وع8 فقط. يبين الجدول ثلاث إشارات مقترحة من قطع ورقية. المعرفات والأشياء افتراضية، ولم ننشئ قاعدة بيانات أو نفحص محتويات علب حقيقية.

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

القطعة الافتراضيةالإشارةما نعرفه من جدول العلب
مثلثع4يوجد صف بهذه القيمة
دائرةع8يوجد صف بهذه القيمة
زاويةع6لا يوجد صف بهذه القيمة في المثال

لماذا لا نفترض أن القيد مفعل؟

توضح SQLite اشتراط دعم القيود في بناء المكتبة وتفعيلها في كل اتصال. ويمكن فحص الحالة باستعلام PRAGMA foreign_keys؛ ولا يغير تشغيلها وسط معاملة متعددة الأوامر حالتها. [1]

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

هل الإشارة null تحتاج علبة مرجعية؟

في SQLite يكفي وجود null في أحد أجزاء مفتاح الابن لعدم اشتراط صف أب مطابق. [1]

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

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

  1. SQLite: Foreign Key Support (يفتح في نافذة جديدة)sqlite.org

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