При удалении связей hasOne или hasMany должен ли значение foreignKey быть равно NULL? - PullRequest
1 голос
/ 29 сентября 2008

Дано:

В группе много людей

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

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

Ответы [ 4 ]

3 голосов
/ 29 сентября 2008

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

1 голос
/ 29 сентября 2008

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

0 голосов
/ 08 марта 2014

Альтернативным, более стабильным способом реализации ситуации, когда обе сущности независимы, было бы полное удаление внешнего ключа из 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.'
        )
    )
);
0 голосов
/ 29 сентября 2008

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

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

...