2012-12-18 2 views
1

웹 응용 프로그램에 "Add Friend"을 구현 중이므로 다른 사용자를 악마로 추가 할 수 있습니다.MySQL - 2 방향 쿼리 검사

우리는 두 테이블이 있습니다 tbl_userstbl_relations을 tbl_users 예를 들어 tbl_relations의 일부 행은, 친구 사용자를 저장할 등록 된 사용자 및 tbl_relations에 대한 고유 한 ID를 가지고 :

id  user_id_1  user_id_2 
1  4    6 
2  4    8 
3  8    23 
4  12   84 
5  3    4 
... 

위의 결과에서 id는 tbl_relations의 고유 ID이고 user_id_1은 tbl_users에 대한 외래 키이며 user_id_2는 tbl_users의 외래 키입니다. 이제 ID가 "4"인 사용자가 사용자와 친구인지 확인하고 쿼리 할 것인지 상상해보십시오. 이드는 "9"또는 아님, 여기에 2 가지 방식으로 쿼리를 전송해야합니다. 즉 :

SELECT * FROM tbl_relations WHERE (user_id_1 = '4' AND user_id_2 = '9') OR (user_id_1 = '9' AND user_id_2 = '4') 

위의 쿼리는 나에게 조금 이상하게 보일 것입니다. 아마도 다른 데이터베이스 구조 일 것입니다.

또는 다른 검색어 명의 사용자가 "4"와 "8"인 사용자간에이 시나리오를 사용하려면 어떻게해야합니까? 거기에 더 나은 데이터베이스 구조가 무엇입니까?

나는 어떤 종류의 도움을 주셔서 감사합니다.

답변

2

대칭이라는 관계를 정규화하지 않을 것입니다. 즉, 1과 2가 친구 인 경우 두 줄 (1,2)과 (2,1)을가집니다.

단점은 크기가 두 배이므로 우정을 쌓고 깨는 데 2 ​​번 씁니다. 장점은 모든 읽기 쿼리가 더 간단하다는 것입니다. 이것은 아마도 좋은 트레이드 오프 일 것입니다. 왜냐하면 대부분 당신이 글쓰기 대신 읽기를하고 있기 때문입니다.

이것은 결국 하나의 데이터베이스를 초과하여 사용자 샤딩을 결정하면 다른 모든 db 샤드를 거치지 않아도 사람의 친구를 찾을 수 있다는 장점이 있습니다.

+0

큰 기업이 구현하는 방법을 다른이 있습니까?나는 페이스 북, G +, 링크 된 것을 의미한다 ... 나는 그렇게 생각하지 않는다! Mutual Friends는 어때? 덕분에 – behz4d

+1

페이스 북은 이런 식으로 구현하지만 규모가 없기 때문에 대부분의 작업은 db 서버에서 수행되지 않습니다. 상호적인 친구는 두 사용자의 친구 행을 교차하여 수행 할 수 있습니다. 'SELECT * FROM tbl_relations into a INNER JOIN tbl_relations as b a.user_id_2 = b.user_id_2 WHERE a.user_id_1 = '4'AND b.user_id_1 = '9'. – yiding

1

당신은 당신이 중복 업데이트 할 때마다 확인해야 할 것이다이 방법을 수행합니다. 왜이

user_id1 tbl_relations에서 선택

*이 user_id1가 (4,9)

에이 여전히에서 이상한 것 같다 곳으로

다음 쿼리를 friend_id 그것은 '친구'관계가 일방적이라는 것을 의미한다. 당신이 이런 식으로한다면 - -

는 '상호'친구를 얻을 수

이 * tbl_relations의 T0에서
이 t0.friend_id = t1.friend_id
에 tbl_relations의 T1에 가입 선택 어디 t0.user_id1 = ? 및 t1.user_id1 =?

+0

이 답변으로 어떻게 2 방향 수표가 해결되는지 모르겠다. 더 설명해 주시겠습니까? thanks – behz4d

+0

같은 친구가있는 두 개의 'user_ids'를 쿼리하고 있습니다. 그것의 '준비된 성명'형식입니다. – ethrbunny

+0

'select * from tbl_relations (4,9)'의 user_id1이 틀리면 'user_id1 = 4'또는 'user_id1 = 9'의 모든 레코드가 반환됩니다. 분명히 2 명의 사용자가 친구인지 아닌지를 판단 할 수 없습니다! – behz4d