2011-08-18 6 views
2

테이블에 대칭 관계가있는 경우이를 우아한 방식으로 표현하는 방법은 무엇입니까? 예를 들어 Friend이라는 테이블이 있는데이 테이블에는 두 명의 사용자 ID가 있어야합니다. 우리가이 표에 UID1UID2를 사용하는 경우 우리가 A_uid 및 B_uid 친구 여부를 확인하고자 할 때, 우리는 UID1 이후데이터베이스 모델링에서 대칭 관계를 표현하는 방법

SELECT * FROM Friend WHERE (UID1 = A_uid AND UID2 = B_uid) OR (UID1 = B_uid AND UID2 = A_uid); 

를 사용해야하고 UID2은 우정을 나타내는에서 동일합니다. 그리고이 딜레마에서 가장 중요한 것은 UID1UID2이 대칭이라는 것입니다.

나는 이것이 추한 것 같아서 더 좋은 방법이 있는지 알고 싶다.

감사합니다.

답변

4

내 머리 위로 떨어져 아이디어 : 그럼

CREATE TABLE friends (
    uid1 uid REFERENCES users, 
    uid2 uid REFERENCES users, 
    PRIMARY KEY (uid1, uid2), 
    CONSTRAINT uid1_above_uid2 CHECK(uid1 < uid2) 
); 

를 쿼리가 먼저 하나의 하위를 넣어해야합니다 : 귀하의 UID 유형은 전체 순서에 따라 경우에, 당신은 이런 식으로 뭔가를 할 수 . 그러나 당신이 보장하는 저장 프로 시저와 그 보호 할 수 있습니다 당신이 그렇게 할 것을 : 물론있을 것이다

CREATE FUNCTION friends_with(uid, uid) RETURNS SETOF friends AS $$ 
    SELECT * FROM friends WHERE uid1 = LESSER($1, $2) AND uid2 = GREATER($1, $2) 
$$ LANGUAGE SQL; 

선택의 RDBMS로 번역 할 수 있습니다.

SELECT * FROM friends_with(5001, 2393); 
SELECT * FROM friends_with(2393, 5001); 

그들은 같은 결과를 반환 :

이제 쿼리는 다음과 같습니다.

한편, CHECK 제약을 두지 않고 절차로 보호 할 수 있습니다. 우연히 같은 관계를 두 번 이상 삽입하는 것을 방지하기 위해 편리하다고 생각합니다.