2010-03-12 3 views
1

두 개의 하위 테이블이있는 테이블이 있습니다. 부모 테이블의 각 레코드에 대해 자식 테이블 중 하나에 하나의 레코드 만 필요합니다. 어떻게 정의 할 수 있습니까?하나의 테이블 또는 다른 테이블에 하위 레코드를 보장 하나 둘 모두를 보장하지 않습니까?

여기에 뒷 이야기가 있습니다. 이 구현을 비판하는 것은 자유롭지 만 위의 질문에 답하십시오.이 문제는 내가 만난 유일한시기가 아니기 때문에 답하십시오.

사용자 설문 조사와 관련된 데이터가있는 데이터베이스가 있습니다. 그것은 원래 설문 조사를 시작하기위한 하나의 인증 방법으로 설계되었습니다. 그 이후로 요구 사항이 변경되었으므로 누군가가 설문 조사를 시작하기 위해 사인 할 수있는 두 가지 방법이 있습니다.

원래 설문 조사 테이블의 열에 인증 토큰을 캡처했습니다. 요구 사항이 변경 되었기 때문에 인증에서 캡처 할 다른 세 가지 데이터가 있습니다. 따라서 조사 테이블의 각 레코드에 대해 하나의 토큰 또는 세 개의 토큰을 갖게됩니다. 이들 중 네 가지 유형이 모두 다르므로 내 생각에 두 열 중 하나가 null이거나 세 가지가 null이 될 수도있는 (또는 더 나쁜 경우 해당 시나리오 중 하나의 나쁜 매시업) 4 개의 열이있는 대신 나는 두 개의 자식 테이블을 가질 것이고 하나는 하나의 인증 토큰을 보유하고, 다른 하나는 세 개를 보유 할 것이다. 문제는 DDL에서 정의하는 방법을 알지 못합니다.

저는 MySQL을 사용하고 있습니다. MySQL이 구현하지 않는 기능이 있습니다.

답변

1

여러 가지 방법으로 당신이 ParentTable이 ChildTableDataInserted 전화에 당신은 부울 플래그를 가질 수 있고 행이 어느 하나 개의 테이블에 삽입되는 경우는 true로 업데이트 할 수 있습니다이

부울 플래그 로직

을 구현할 수 있습니다 . ChildTableDataInserted가 False 인 경우에만 자식 행에 삽입하십시오. 이 과정은 작성한 저장 프로 시저를 사용하는 모든 삽입에 따라 달라지며 쉽게 위반 될 수 있지만 데이터베이스의 오버 헤드는 적습니다.

트리거는

를 대고 자식 테이블 모두에 데이터 삽입에 INSERT하고 오류 조건이 충족되면, 당신은 삽입에 대한 오류가 발생하기 전에.

나는 다른 옵션이 없다면 개인적으로 트리거를 피합니다. 트리거를 구현하는 좋은 장소 인 것 같습니다.

여기 트리거에 대한 자세한

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

아를 읽어보세요! 방아쇠는 내가 사용한 적이없는 것입니다. 이 상황이 다른 옵션이 아닌 트리거일까요? 내가하고 싶은 일을 어떻게 하겠니? – user151841

+2

3 정규형을 위반하고 하나의 테이블에 4 개의 열을 넣는 것을 고려할 것입니다. –

+0

Practicality wins out, Raj :) – user151841

관련 문제