[SQL] SQL은 다 대다 같은 유형의 관계 테이블로 만들려면
SQLSQL은 다 대다 같은 유형의 관계 테이블로 만들려면
나는 SQL에 초보자 그리고 난 내가 데이터베이스를 설계하고있어 어려운 인 내가 코딩 해요로 가능한 한 많이 배우려고 노력하고 첫 머리에 점프하고있어 나는 잠시 동안 함께 생활해야합니다 나는 그렇게 확실히 나는 바로 그것을 할 수 있도록하고 싶다. 나는 대다 다리 테이블의 기초를 배운하지만,이 개 필드는 동일한 유형은 어떤 경우? 의는 수천 명의 사용자와 소셜 네트워크를 가정 해 봅시다, 어떻게 당신과 친구가 누구인지 추적 할 수있는 테이블을 만들까요? 만약에 것은 각 관계에 대한 자세한 데이터가 말하자면 ... 예를 들어, "날짜 friended했다". 같은 쿼리가있을 것이라는 점을 알고 "userX의 모든 친구를 표시는 dateY 및 dateZ 사이 friended했다". 내 데이터베이스는 다음과 같이 여러 가지 상황을 것이다 나는 그것을 할 수있는 효율적인 방법을 알아낼 수 없습니다. 그것은 나를 위해 많이오고 있기 때문에, 나는 그림 다른 사람은 오른쪽 테이블을 설계하는 가장 좋은 방법을 알아 낸?
해결법
-
==============================
1.다음 두 친구의 ID와의 관계에 대한 모든 종류의 정보를 저장 관계 테이블을 사용자 테이블을 만듭니다.
다음 두 친구의 ID와의 관계에 대한 모든 종류의 정보를 저장 관계 테이블을 사용자 테이블을 만듭니다.
CREATE TABLE `Users` ( `id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `Relationships` ( `id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL, `userid` TINYINT NULL DEFAULT NULL, `friendid` TINYINT NULL DEFAULT NULL, `friended` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ); ALTER TABLE `Relationships` ADD FOREIGN KEY (userid) REFERENCES `Users` (`id`); ALTER TABLE `Relationships` ADD FOREIGN KEY (friendid) REFERENCES `Users` (`id`);
이 데이터로 테이블을 채우기 후, 당신은 당신의 모든 친구를 얻으려면 SQL SELECT 쿼리를 생성 할 수 있습니다. 친구가 id가 당신의 ID가 반대편에있는 동안 한 쪽 측면에있는 것들이다. 두 번 저장 관계를 필요가 없습니다 당신은 당신의 id 인 양면을 확인합니다. 또한 당신은 당신이 (정상적이고 건강한 세계에서) 자신의 친구가 될 수 없기 때문에, 당신의 ID를 제외해야합니다.
SELECT * FROM Users u INNER JOIN Relationships r ON u.id = r.userid INNER JOIN Relationships r ON u.id = r.friendid WHERE (r.userid = $myid OR r.friendid = $myid) AND r.friended >= $startdate AND r.friended <= $enddate AND u.id != $myid;
어디 $ 대한 myid, $ STARTDATE 당신이 당신의 데이터베이스에 직접 코드를 전달할 수 있습니다 따옴표 있도록 $ 종료 날짜 PHP 변수가 될 수 있습니다.
-
==============================
2.모델
모델
세 개의 테이블 스트레칭 모델은 옵션이 될 것입니다. 당신은 모든 사용자의 세부 사항 (이름, 생년월일, ...)와 명백한 테이블 사용자이있을 것이다.
CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45), `dob` DATE, PRIMARY KEY (`id`) );
둘째, 사용자의 테이블 연결은 연결 (이 연결이 내 사진 앨범을 볼 수 있습니다)에 부여 된 권한을 포함 할 수 있고, 중요한 테이블 우정을 참조한다. 우리는 한 사용자가 많은 우정으로 연결 될 수 있기 때문에 그 사이에 테이블 연결이 필요합니다.
CREATE TABLE `connection` ( `id` INT NOT NULL AUTO_INCREMENT, `user_id` INT NOT NULL, `friendship_id` INT NOT NULL, `privilege_mask` TINYINT, PRIMARY KEY (`id`) );
차례로 우정은 우정이 설정되었을 때와 같은 공유 세부 사항을 포함 할 수있다. 같은 우정에 연결되어있는 사용자는 친구입니다.
CREATE TABLE `friendship` ( `id` INT NOT NULL AUTO_INCREMENT, `met_first_time` DATE, PRIMARY KEY (`id`) );
하지만 조금 더 많은 작업을 구현하는 것입니다 - (존재하지한다! 일방적 인 우정)이 방법은 다른 솔루션은 지금까지이 방향성을 피할 수 있음에 배치하는 것보다 더 사실적인 모델이 될 것입니다.
쿼리 친구
, 친구의 이름을 조회해야한다 (테스트하지 않지만) 될 수있는 예 :
SELECT B.name FROM user A INNER JOIN connection conn_A ON conn_A.user_id = A.id INNER JOIN connection conn_B ON conn_A.friendship_id = conn_B.friendship_id INNER JOIN user B ON conn_B.user_id = B.id INNER JOIN friendship ON friendship.id = conn_A.friendship_id WHERE A.name = 'Dan' AND A.id <> B.id AND friendship.met_first_time BETWEEN '2013-4-1' AND '2013-6-30';
당신은 당신이 친구를 만든 날짜에 대해 걱정하지 않는 경우에, 당신은 연결이 이미 friendship_id 키를 공유하기 때문에 우정 테이블에 가입 할 필요가 없습니다 것을 알 수 있습니다. 이러한 쿼리의 본질은이 conn_A.friendship_id = conn_B.friendship_id에 conn_A 및 conn_B 사이에 가입 할 것이다.
-
==============================
3.하나의 연결 테이블 접미사, 그래서 좋아한다 :
하나의 연결 테이블 접미사, 그래서 좋아한다 :
People( PersonId bigint, Name nvarchar, etc ) Friends( FromPersonId bigint, ToPersonId bigint, DateAdded datetime )
예 쿼리 :
SELECT People.Name FROM Friends INNER JOIN People ON Friends.FromPersonId = People.PersonId WHERE Friends.ToPersonId = @myPersonId
SELECT People.Name FROM Friends INNER JOIN People ON Friends.FromPersonId = People.PersonId WHERE Friends.ToPersonId = @myPersonId AND Friends.DateAdded >= @startDate AND Friends.DateAdded <= @endDate
-
==============================
4.당신은 (관계조차하지 양방향 경우 고유의 것)의 관계 테이블에 ID의 PRIMARY KEY로 두 사용자를 사용해야합니다. 뭐 그런
당신은 (관계조차하지 양방향 경우 고유의 것)의 관계 테이블에 ID의 PRIMARY KEY로 두 사용자를 사용해야합니다. 뭐 그런
참고 :
from https://stackoverflow.com/questions/18603372/how-to-make-sql-many-to-many-same-type-relationship-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 각 카테고리의 상위 5 반환 (0) | 2020.04.19 |
---|---|
[SQL] 병합 중복 날짜 간격 (0) | 2020.04.19 |
[SQL] JSON 열의 배열의 요소를 쿼리 (0) | 2020.04.19 |
[SQL] `REPLACE`와 MySQL에서 'INSERT ... ON DUPLICATE KEY UPDATE` 사이의 실제적인 차이점은 무엇입니까? (0) | 2020.04.19 |
[SQL] 어떻게 MySQL의에서 여러 열을 검색하려면? (0) | 2020.04.19 |