2017-09-13 6 views
0

사용자 및 작업 그룹 이름이 인 두 개의 테이블이있는 간단한 상황을 고려하십시오.외래 키 순환 참조 딜레마

  1. 사용자의 전자 메일 주소는 사용자 테이블의 기본 키입니다.
  2. Workgroup_id는 WorkGroup 테이블의 기본 키입니다.
  3. 사용자는 여러 작업 그룹을 만들 수 있습니다.
  4. 사용자는 단지 하나의 작업 그룹에 속할 수 있습니다.

이 시나리오에서는 어떤 사용자 이 작업 그룹을 생성했는지 추적해야합니다.

은 이미 수행 한 것 :

  1. 는 사용자 테이블에서 변수 이름 workgroup_id 사용자가 속한 작업 그룹 알아야합니다. 이것은 Workgroup 테이블의 workgroup_id에 대한 외래 키입니다.
  2. 작업 그룹 테이블에서 user_email이라는 변수를 사용하여 작업 그룹을 만든 사용자를 추적합니다. 이것은 users 테이블의 user_email에 대한 외래 키입니다.

I 현재 직면하고 문제는이 사용자 및 작업 테이블 사이의 환상 참조 초래한다는 것이다. 프로그래밍에서 순환 참조는 아무리 큰 문제도 아니기 때문에

어떻게 해결할 수 있습니까? 내가 여기서 누락 된 더 나은 디자인 패턴이 있습니까?

편집 : 여부에 관해서는 "순환 참조가 큰 아니오"여부를 개념적으로 그들이하지 않을 수 있지만,이 구현은 다른 데이터베이스에서 비 보편적이기 때문에, 그들은 여전히 ​​유효한 문제가 남아있다. ORM을 사용하는 경우 데이터베이스의 ORM 지원으로 인해 가질 수있는 데이터베이스 디자인의 종류가 제한되는 경우가 더 심해집니다.

+0

이것이 주기적으로 보이지 않습니다. 작업 그룹을 만드는 사용자와 작업 그룹의 사용자는 관련이 없습니다. 식별 할 수없는 관계와 식별 할 수없는 관계를 파악할 수 있습니다. https://stackoverflow.com/questions/762937/whats-the-difference-between-identifying-and-non-identifying-relationships – dragmosh

+1

@dragmosh 그런 식으로, 여전히 닭고기와 달걀 문제가 있습니다. 제작자 전자 메일이 필요하기 때문에 첫 번째 작업 그룹을 만들 수 없습니다. 그리고 그는 작업 그룹 ID가 필요하기 때문에 첫 번째 사용자를 만들 수 없습니다. – Barmar

+0

아마도 이와 같은 디자인 질문에 많은 차이를 만들지는 않을지라도, mysql과 sql server는 동일한 제품이 아니므로이 태그를 사용하지 않는 것이 좋습니다. – Xedni

답변

2

외래 키 중 하나 이상을 NULL으로 허용해야합니다. 이렇게하면 외래 키를 자리 표시 자로 비워 두어 해당 테이블의 첫 번째 행을 만들 수 있습니다. 다른 테이블에 해당 행을 작성한 후 첫 x 째 행에서 외부 키를 갱신합니다.

또한 영구적 인 상태로 OK라고 결정할 수도 있습니다. 사용자를 만들기 전에 첫 번째 작업 그룹을 자동으로 만드는 경우 첫 번째 작업 그룹에는 실제로 작성자가 없으므로이 작업 그룹을 NULL으로 설정할 수 있습니다.

+0

고마워요 Barmar, 사실 그건 훌륭한 해결책입니다. 그러나 행의 관점에서 외래 키를 어떻게 생각합니까 (질문의 컨텍스트에서만)? 이 경우 작업 그룹을 생성 한 사용자는 작업 그룹 자체 앞에 항상 존재하게됩니다. 작업 그룹 추가 및 삭제는 문제가되지 않습니다. 그렇다면 구조는 순환 참조 상태 여야합니까? –

+0

그런 다음 첫 번째 사용자는 자신이 속한 작업 그룹보다 먼저 만들어야하기 때문에 nullable 열은'users.workgroup'이어야합니다. – Barmar