عند حذف اقترانات hasOne أو hasMany، هل يجب ضبط المفتاح الأجنبي على NULL؟

StackOverflow https://stackoverflow.com/questions/148169

سؤال

منح :

المجموعة لديها العديد من الأشخاص

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

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

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

المحلول

نعم، يجب تعيين المفاتيح الخارجية على NULL (أو 0، إذا كانت هذه هي قيمة "no group" التي اخترتها) وإلا ستفقد التكامل المرجعي.إذا كانت قاعدة بياناتك تدعم ذلك، فمن المفترض أن تكون قادرًا على تعيين مشغل "عند الحذف" أو قاعدة تتالي في إطار العمل الخاص بك لفرض ذلك.ويبدو أن السلوك في CakePHP صحيح.إذا كانت القيمة تابعة، فيجب إزالتها عند الحذف.إذا لم تكن تابعة، فأنت بحاجة إلى إعطاء منطق سلوك إضافي فيما يتعلق بالإجراء الصحيح الذي يجب اتخاذه (في هذه الحالة، تريد تعيين كافة القيم على NULL.وفي حالات أخرى، قد ترغب في التعيين إلى مجموعة "افتراضية"، وما إلى ذلك)

نصائح أخرى

في كلمة واحدة، نعم.قد يؤدي ترك المفتاح الخارجي على جدول الأشخاص إلى فقدان التكامل المرجعي داخل قاعدة البيانات.

> إذا لم تقم بذلك، فسيحاول الشخص الانتماء إلى مجموعة غير موجودة.

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

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

سيبدو الجدول هكذا

id, group_id, person_id

سيبدو نموذج المجموعة_الأشخاص هكذا

Person hasMany GroupPerson
Group hasMany GroupPerson
GroupPerson belongsTo Person, Group

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

var $validate=array(
    'person_id'=>array(
        array(
        'rule'=>'isUnique',
        'message'=>'This person is already in a group.'
        )
    )
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top