Wenn hasOne oder hasMany Vereinigungen zu löschen, sollte die foreignKey auf NULL gesetzt werden?

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

Frage

Gegeben:

  

Gruppe hasMany Personen

aber die Beziehung ist unabhängig (dh. Personen bestehen können zu einer Gruppe ohne Zugehörigkeit), sollte der Fremdschlüssel in der Tabelle Personen (dh group_id) bis 0 (oder NULL) gesetzt werden, wenn eine Gruppe zu löschen? Wenn Sie dies nicht tun, wird die Person versuchen, zu einer Gruppe gehören, die es gibt does.

Der Grund, warum ich frage ist, dass dieses Standardverhalten in CakePHP ist. Wenn Sie auf true abhängig gesetzt ist, wird es die dazugehörigen Modelle zu löschen, aber wenn es auf false gesetzt ist wird es das zugehörige Modell unberührt lassen.

War es hilfreich?

Lösung

Ja, die Fremdschlüssel sollte auf NULL gesetzt werden (oder 0, wenn dies Ihr gewählt ist ‚keine Gruppe‘ Wert) oder Sie verlieren referentielle Integrität. Wenn Ihre Datenbank unterstützt, sollten Sie in der Lage sein, einen ‚On löschen‘ Trigger oder eine Kaskade Regel im Rahmen zu setzen, dies zu erzwingen. Und das Verhalten in CakePHP scheint richtig. Wenn der Wert abhängig ist, dann sollte es auf Löschen entfernt werden. Wenn es nicht abhängig ist, dann müssen Sie in Bezug auf die richtige Aktion zusätzliche Verhalten Logik geben (in diesem Fall zu übernehmen, können Sie alle Werte auf NULL gesetzt werden sollen. In anderen Fällen können Sie auf eine ‚default‘ Gruppe setzen usw.)

Andere Tipps

In einem Wort, ja. Beim Verlassen des Fremdschlüssels auf der Tabelle Personen würde den Verlust von referentielle Integrität in der Datenbank.

> Wenn Sie nicht, wird die Person versuchen, zu einer Gruppe gehören, die es gibt does't.

Es gibt auch ein schlimmeres Szenario:. In der Zukunft eine neue Gruppe B erscheinen, dass die ID der gelöschten Gruppe A. Wiederverwendung wird dann werden alle ehemaligen Eine Gruppe Nutzer „magische Weise“ sein eingetragen in neue Gruppe B

Eine Alternative, stabile Art und Weise, eine Situation zu implementieren, wo beide Einheiten unabhängig wäre, den Fremdschlüssel vollständig von Person zu entfernen und erstellen eine Tabelle group_persons verbinden. Auf diese Weise müssen Sie nicht über Ihre Referenz Integrität sorgen, wenn eine Gruppe zu löschen. Wenn Sie eine Gruppe löschen, würde die Vereinigung von group_persons gelöscht werden.

Die Tabelle würde wie folgt aussehen

id, group_id, person_id

Das group_persons Modell wird wie folgt aussehen

Person hasMany GroupPerson
Group hasMany GroupPerson
GroupPerson belongsTo Person, Group

Wenn Sie die Person mögen nur in der Lage sein, in einer Gruppe zu einer Zeit zu sein, stellte eine einzigartige Gültigkeitsregel in GroupPerson.

var $validate=array(
    'person_id'=>array(
        array(
        'rule'=>'isUnique',
        'message'=>'This person is already in a group.'
        )
    )
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top