При удалении ассоциаций hasOne или hasMany следует ли установить для ForeignKey значение NULL?

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

Вопрос

Данный :

В группе много человек

но отношения независимы (т.Люди могут существовать без принадлежности к группе), должен ли внешний ключ в таблице лиц (т. е. group_id) быть установлен на 0 (или NULL) при удалении группы?Если вы этого не сделаете, человек попытается принадлежать к несуществующей группе.

Причина, по которой я спрашиваю, заключается в том, что это поведение по умолчанию в Cakephp.Если вы установите для параметраdependent значение true, связанные модели будут удалены, но если для параметра установлено значение false, связанная модель останется нетронутой.

Это было полезно?

Решение

Да, для внешних ключей должно быть установлено значение NULL (или 0, если вы выбрали это значение «без группы»), иначе вы потеряете ссылочную целостность.Если ваша база данных поддерживает это, вы сможете установить триггер «При удалении» или правило каскада в своей структуре, чтобы обеспечить это.И поведение CakePHP кажется правильным.Если значение является зависимым, то его следует удалить при удалении.Если это не зависит, вам нужно предоставить дополнительную логику поведения для правильного действия (в этом случае вы хотите установить все значения в NULL.В других случаях вы можете установить группу «по умолчанию» и т. д.)

Другие советы

Одним словом, да.Если оставить внешний ключ в таблице person, это приведет к потере ссылочная целостность внутри базы данных.

> Если этого не сделать, человек попытается принадлежать к несуществующей группе.

Есть и худший сценарий:в будущем может появиться новая группа B, которая будет повторно использовать идентификатор удаленной группы A.Тогда все бывшие пользователи группы A будут «волшебным образом» включены в новую группу B.

Альтернативный, более стабильный способ реализовать ситуацию, когда обе сущности независимы, — полностью удалить внешний ключ из Person и создать объединяющую таблицу group_persons.Таким образом, вам не придется беспокоиться о целостности ссылок при удалении группы.Когда вы удаляете группу, ассоциация будет удалена из group_persons.

Таблица будет выглядеть так

id, group_id, person_id

Модель group_persons будет выглядеть так

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