사용자 당 하나가 아닌 하나의 연결 테이블 만 소개합니다.
- A "사용자"제로 하나 이상의 "그림"을 "저장"할 수
- A "그림"0으로 저장할 수 있습니다 에 이상 "사용자"
우리는 소개 세 번째 테이블은 "user_picture"또는 "picture_user"또는 "saved_picture"라고 부릅니다 (테이블 이름 일 뿐이지 만 모델을 보는 사람에게는 "이해"해야합니다).
이 테이블에는 외래 키 :
user_id REFERENCES user(id)
picture_id REFERENCES picture(id)
이 두 열의 조합은 PRIMARY KEY 역할을 할 수 있습니다.
PRIMARY KEY (user_id, picture_id)
는 사용자의 저장된 사진을 얻으려면 : 큰 테이블에서 행의 작은 부분 집합을 선택 가능 적합한 인덱스와
SELECT p.*
FROM picture p
JOIN saved_picture s
ON s.picture_id = p.id
JOIN user u
ON u.id = s.user_id
WHERE u.username = 'foo'
은 여전히 매우 효율적이어야한다.
이 디자인을 사용하면 "어떤 사진이 '가장 많이 저장 되었습니까?'와 같은 몇 가지 질문에 쉽게 답할 수 있습니다.
SELECT s.picture_id
, COUNT(1) AS save_count
FROM saved_picture s
GROUP BY s.picture_id
ORDER BY COUNT(1) DESC
아주 큰 테이블의 경우에는 잠시 시간이 걸릴 수 있으므로 간단하고 짧은 대리 키가 실제로 도움이됩니다.
각 사용자에 대해 별도의 "저장"테이블이있는 경우 동일한 질문에 대답해야하는 쿼리와 비교하십시오. 쿼리해야 할 테이블의 수를 고려하십시오.
는 saved_picture
테이블 (예를 들어, date_saved
)에 속성을 추가하기 시작하면, 당신은 테이블에 대리 기본 키를 추가하고에 UNIQUE 제약 (USER_ID, picture_id)를 사용하여 고려할 수 있습니다.
no. 그게 당신이 그것에 대해 어떻게 행동하는지 정확하게 알려줍니다.그것이 바로 관계형 데이터베이스입니다. 관련 데이터. –
고마워요! 테이블에 많은 레지스터가 포함되어 있고 한 명의 사용자가 작성한 모든 항목을 확인하는 쿼리를 작성하는 것이 오래 걸릴 것이라고 생각했기 때문에 확실하지 않았습니다. – NMO
@ user2615855 : 수백만 행을 효율적으로 검색 할 수 있도록 적절한 색인을 만들 수있는 곳입니다. 또한 짧은 기본 키 (INT와 같은)를 사용하면 효율성이 향상됩니다. 당신은 성능에 대해 염려하는 것이 옳지 만, 다른 테이블 각각에 대해 외래 키가있는 "연관성"테이블은 정확히 필요한 것입니다. "like"를 추가하거나 "like"를 제거하는 것은 매우 간단한 작업입니다. 해당 테이블의 기본 키는 두 외래 키의 조합 일 수 있지만 특성을 추가하기 시작하면 (예 : date_liked) ID 열을 PK로, UNIQUE를 – spencer7593