Hasone 또는 Hasmany 연관성을 삭제할 때 외국인이 NULL로 설정해야합니까?

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

문제

주어진 :

그룹 HASMANY 사람들

그러나 관계는 독립적입니다 (예 : 사람은 그룹에 속하지 않고 존재할 수 있습니다), 그룹을 삭제할 때 사람 테이블 (예 : Group_id)의 외국 키가 0 (또는 null)으로 설정되어야합니까? 그렇지 않은 경우, 그 사람은 존재하지 않는 그룹에 속해야합니다.

내가 묻는 이유는 이것이 CakePHP의 기본 동작이기 때문입니다. True에 의존하는 경우 관련 모델이 삭제되지만 False로 설정되면 관련 모델이 손대지 않습니다.

도움이 되었습니까?

해결책

예, 외국 키는 NULL (또는 0, 선택한 '그룹'값 인 경우 0)으로 설정하거나 참조 무결성을 잃어야합니다. 데이터베이스가 지원하는 경우 프레임 워크에서 'On Delete'트리거 또는 캐스케이드 규칙을 설정하여이를 시행 할 수 있어야합니다. 그리고 CakePHP의 행동이 옳은 것 같습니다. 값이 의존적이면 삭제시 제거해야합니다. 의존하지 않으면 취할 올바른 조치에 대한 추가 행동 논리를 제공해야합니다 (이 경우 모든 값을 null로 설정하려고합니다. 다른 경우에는 '기본값'그룹으로 설정할 수 있습니다. , 등)

다른 팁

한마디로, 그렇습니다. 사람 테이블에 외국 열쇠를 남겨두면 손실이 발생할 수 있습니다. 참조 무결성 데이터베이스 내에서.

> 그렇지 않은 경우, 그 사람은 존재하지 않는 그룹에 속해야합니다.

더 나쁜 시나리오도 있습니다. 향후에 삭제 된 그룹 A의 ID를 재사용하는 새로운 그룹 B가 나타날 수 있습니다. 그러면 이전의 모든 그룹의 사용자는 새로운 그룹 B에 "마술 적으로"입대됩니다.

두 엔티티가 독립적 인 상황을 구현하는 대안적이고 안정적인 방법은 사람으로부터 외국 키를 완전히 제거하고 가입 테이블 그룹_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