복붙노트

[SQL] SQL은 다 대다 같은 유형의 관계 테이블로 만들려면

SQL

SQL은 다 대다 같은 유형의 관계 테이블로 만들려면

나는 SQL에 초보자 그리고 난 내가 데이터베이스를 설계하고있어 어려운 인 내가 코딩 해요로 가능한 한 많이 배우려고 노력하고 첫 머리에 점프하고있어 나는 잠시 동안 함께 생활해야합니다 나는 그렇게 확실히 나는 바로 그것을 할 수 있도록하고 싶다. 나는 대다 다리 테이블의 기초를 배운하지만,이 개 필드는 동일한 유형은 어떤 경우? 의는 수천 명의 사용자와 소셜 네트워크를 가정 해 봅시다, 어떻게 당신과 친구가 누구인지 추적 할 수있는 테이블을 만들까요? 만약에 것은 각 관계에 대한 자세한 데이터가 말하자면 ... 예를 들어, "날짜 friended했다". 같은 쿼리가있을 것이라는 점을 알고 "userX의 모든 친구를 표시는 dateY 및 dateZ 사이 friended했다". 내 데이터베이스는 다음과 같이 여러 가지 상황을 것이다 나는 그것을 할 수있는 효율적인 방법을 알아낼 수 없습니다. 그것은 나를 위해 많이오고 있기 때문에, 나는 그림 다른 사람은 오른쪽 테이블을 설계하는 가장 좋은 방법을 알아 낸?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.당신은 (관계조차하지 양방향 경우 고유의 것)의 관계 테이블에 ID의 PRIMARY KEY로 두 사용자를 사용해야합니다. 뭐 그런

    당신은 (관계조차하지 양방향 경우 고유의 것)의 관계 테이블에 ID의 PRIMARY KEY로 두 사용자를 사용해야합니다. 뭐 그런

    참고 :

  5. from https://stackoverflow.com/questions/18603372/how-to-make-sql-many-to-many-same-type-relationship-table by cc-by-sa and MIT license