Quando si eliminano le associazioni hasOne o hasMany, foreignKey deve essere impostato su NULL?

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

Domanda

Dato:

  

Il gruppo ha molte persone

ma la relazione è indipendente (es. le persone possono esistere senza appartenere a un gruppo), la chiave esterna nella tabella persone (es. group_id) deve essere impostata su 0 (o NULL) quando si elimina un gruppo? In caso contrario, la persona tenterà di appartenere a un gruppo che non esiste.

Il motivo per cui lo chiedo è che questo è un comportamento predefinito in Cakephp. Se si imposta dipendente da vero, eliminerà i modelli associati, ma se impostato su falso non verrà toccato il modello associato.

È stato utile?

Soluzione

Sì, le chiavi esterne devono essere impostate su NULL (o 0, se questo è il valore "nessun gruppo" scelto) o si perde l'integrità referenziale. Se il tuo database lo supporta, dovresti essere in grado di impostare un trigger 'On delete' o una regola a cascata nel tuo framework per far rispettare questo. E il comportamento in CakePHP sembra corretto. Se il valore dipende, è necessario rimuoverlo all'eliminazione. Se non è dipendente, è necessario fornire una logica di comportamento aggiuntiva sull'azione corretta da eseguire (in questo caso, si desidera impostare tutti i valori su NULL. In altri casi, è possibile impostare un gruppo "predefinito" , ecc.)

Altri suggerimenti

In una parola, sì. Lasciare la chiave esterna nella tabella delle persone comporterebbe la perdita di integrità referenziale all'interno del database.

> In caso contrario, la persona tenterà di appartenere a un gruppo che non esiste.

Esiste anche uno scenario peggiore: in futuro potrebbe apparire un nuovo gruppo B che riutilizzerà l'id del gruppo eliminato A. Quindi tutti gli utenti dell'ex gruppo A saranno "magicamente". arruolato nel nuovo gruppo B.

Un modo alternativo e più stabile per implementare una situazione in cui entrambe le entità sono indipendenti sarebbe rimuovere la chiave esterna interamente da Person e creare una tabella di join group_persons. In questo modo non dovrai preoccuparti della tua integrità di riferimento quando elimini un gruppo. Quando elimini un gruppo, l'associazione verrebbe eliminata da group_persons.

La tabella sarebbe simile a questa

id, group_id, person_id

Il modello group_persons sarà simile a questo

Person hasMany GroupPerson
Group hasMany GroupPerson
GroupPerson belongsTo Person, Group

Se desideri che la persona sia in grado di far parte di un solo gruppo alla volta, imposta una regola di convalida univoca in GroupPerson.

var $validate=array(
    'person_id'=>array(
        array(
        'rule'=>'isUnique',
        'message'=>'This person is already in a group.'
        )
    )
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top