Lors de la suppression des associations hasOne ou hasMany, la clé foreignKey doit-elle être définie sur NULL?

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

Question

Donné:

  

Groupe a beaucoup de personnes

mais la relation est indépendante (les personnes peuvent exister sans appartenir à un groupe), la clé étrangère de la table des personnes (ie groupe_id) doit-elle être définie sur 0 (ou sur NULL) lors de la suppression d'un groupe? Si vous ne le faites pas, la personne tentera d'appartenir à un groupe qui n'existe pas.

La raison pour laquelle je pose cette question est qu’il s’agit d’un comportement par défaut dans Cakephp. Si vous définissez depend à true, les modèles associés seront supprimés, mais s'il est défini sur false, le modèle associé reste inchangé.

Était-ce utile?

La solution

Oui, les clés étrangères doivent avoir la valeur NULL (ou 0 s'il s'agit de la valeur "Aucun groupe" choisie) ou vous perdez l'intégrité référentielle. Si votre base de données le prend en charge, vous devriez pouvoir définir un déclencheur "Sur suppression" ou une règle de cascade dans votre infrastructure pour appliquer cela. Et le comportement dans CakePHP semble correct. Si la valeur est dépendante, elle devrait être supprimée lors de la suppression. S'il n'est pas dépendant, vous devez indiquer une logique de comportement supplémentaire pour définir l'action correcte (dans ce cas, vous souhaitez définir toutes les valeurs sur NULL. Dans d'autres cas, vous pouvez définir un groupe 'par défaut'. , etc.)

Autres conseils

En un mot, oui. Le fait de laisser la clé étrangère sur la table des personnes entraînerait la perte de intégrité référentielle dans la base de données.

> Si vous ne le faites pas, la personne tentera d'appartenir à un groupe qui n'existe pas.

Il existe également un scénario pire: à l’avenir, un nouveau groupe B pourrait réutiliser l’id du groupe A supprimé. Tous les anciens utilisateurs du groupe A seront alors "par magie". s'est enrôlé dans le nouveau groupe B.

Un autre moyen plus stable d'implémenter une situation dans laquelle les deux entités sont indépendantes serait de supprimer entièrement la clé étrangère de Person et de créer une table de jointure group_persons. De cette façon, vous n’aurez plus à vous soucier de l’intégrité de votre référence lors de la suppression d’un groupe. Lorsque vous supprimez un groupe, l'association est supprimée de group_persons.

Le tableau ressemblerait à ceci

id, group_id, person_id

Le modèle group_persons ressemblera à ceci

Person hasMany GroupPerson
Group hasMany GroupPerson
GroupPerson belongsTo Person, Group

Si vous souhaitez que la Personne ne puisse appartenir qu'à un groupe à la fois, définissez une règle de validation unique dans GroupPerson.

var $validate=array(
    'person_id'=>array(
        array(
        'rule'=>'isUnique',
        'message'=>'This person is already in a group.'
        )
    )
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top