2017-05-15 7 views
0

저는 데이터베이스 프로젝트를위한 모델링을하고 있으며, 전제 조건을 수립하기 위해 course 테이블을 조인하여 많은 관계를 유지했습니다.많은 방법으로 많은 조인 테이블이 자기 자신과 합류 할 때 중복되는 것을 막을 수 있습니다.

CREATE TABLE course_prereqs (
    course_id INT NOT NULL, 
    prereq_id INT NOT NULL, 

    PRIMARY KEY (course_id, prereq_id), 
    FOREIGN KEY (course_id) REFERENCES course (course_id), 
    FOREIGN KEY (prereq_id) REFERENCES course (course_id) 
) 

은 내가 궁금하면 간단하지만 순환 의존성을 일으킬 것 때문에 대부분의 사용자 친화적 인 방법으로 당신이 테이블에 (1, 2), and (2, 1)있는 전제 조건을 모두 방지 할 수 있습니다 : 같은 테이블 (간체)가 보인다.

내가 상응하는 뭔가를 생각

-- in a trigger though since MySQL doesn't have check 
CHECK (course_id < prereq_id) 

에 있지만이 작동하는 동안 최종 사용자가 항상 course_id 항상 prereq_id보다 적을 수 있는지 확인하는 것이 잠재적으로 성가신 될 수 같은 느낌.

더 좋은 방법이 있습니까, 아니면 course_id이 항상 더 작은 지 확인해야한다는 불편 함을 과소 평가합니까?

답변

1

을 CNT가이 응용 프로그램의 문제처럼 보인다. "코스 # 1은 코스 2의 필수 조건"이라고 말하면 "코스 2는 # 1의 필수 조건"이라고 나중에 말하는 것이 잘못되었습니다. 즉, 데이터베이스에서 절대 발생해서는 안되는 것을 확인해야하는 이유는 무엇입니까? 반면에, '관계'반사적 인 경우

, 그럼 내가 이런 짓을 했을까 (1> 2 2-> 1이 의미) :

그래서 '정식'이 있음을
INSERT IGNORE (a, b) VALUES (LEAST($this, $that), GREATEST($this, $that)); 

관계를 저장하기위한 순서. 테스트가 더 복잡해집니다.

또는 ... 두 관계를 모두 저장하십시오. 단지 두 배가 넘는 행이지만 조회 성능은 눈에 띄지 않습니다. 흠 ... 왜 응용 프로그램 문제입니다 ... 모든 감각을 만드는

PRIMARY KEY(a, b), 
INDEX  (b, a) 
+0

:하지만 두 경우 모두

, 당신은 두 개의 인덱스를해야합니까? 두 과목이 서로 선행 할 수 없다는 사실을 시행하는 것이 데이터베이스의 임무가 아닌가? 예를 들어, 다른 대답의 select 문이 0이 아닌 경우 오류가 발생하는 트리거입니다. – m0meni

+0

@ AR7 - 데이터베이스가 "필수"에서 "과정"을 알 수 없습니다. 따라서 # 1이 실제로 # 2의 전제 조건인데 첫 번째로 course = 1을 삽입하면 선행 조건 = 2이므로 잡히지 않습니다. 나중에 필수 조건 = 1, 코스 = 2의 _correct_ 삽입이 오류로 플래그됩니다. –

0

새로운 코스 점검을 삽입하기 전에 = 0

select count(1) cnt from course_prereqs where course_id = new_prereq_id and prereq_id = new_course_id