سؤال

لدي 3 طاولات تبدو هكذا:
(مصدر: insomniacgeek.com)

على المفاتيح الأجنبية ، قمت بتعيين حذف Cascade. في الوقت الحالي ، عندما أحذف سجلًا في جدول المجلد ، يتم حذف السجل ذي الصلة فقط في المجلد.

هذا متوقع وصحيح.

ما أود إنجازه هو عندما أقوم بحذف سجل في جدول المجلد ، يجب حذف السجلات المقابلة في المجلد وجدول العنصر.

كيف يمكنني حل هذا؟ عن طريق إضافة مشغل يحذف جميع حالات العنصر مع المجلد المعني؟ أم أن هناك حل أفضل؟

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

يجب أن يتم تشغيل FK بين عنصر المجلد والبند أيضًا.

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

لا يمكن حذف سجل FolterItem لأنه إذا كان لديك علاقة M-to-M ، فمن المفترض أن يكون المجلد مرتبطًا بدورة أخرى أيضًا. لذلك ، إذا قمت بحذفه على سجل المجلد ، فيجب حذف العلاقة فقط ، وليس المجلدات ذات الصلة. إذا كان من الممكن أن تكون جميع المجلدات مرتبطة فقط بمجلد واحد فقط ، فيجب عليك استخدام العلاقة الواحدة إلى حد كبير وتعيين سلسلة في المجلد FK (FK-> PK في المجلد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top