2013-07-24 2 views
0

나는 사용자가 좋아하는 그림을 "저장할"수있는 새로운 웹 응용 프로그램을 만들고 있습니다. 나는 그림이 많은 큰 테이블과 사용자 정보가있는 테이블을 가지고있다. 내 질문 : 각 사용자가 "저장"하는 그림을 어떻게 저장할 수 있습니까? 정보를 저장하는 올바른 방법은 무엇입니까? 나는 사용자 아이디와 그림 ID로 새로운 테이블을 만들려고 생각했지만 어쩌면 너무 복잡하고 나중에 쿼리를 작성하는 데 오래 걸릴 것이라고 생각한다.Webapp : 사용자의 "좋아하는 항목"을 올바르게 저장하는 방법은 무엇입니까?

감사합니다 대단히

+4

no. 그게 당신이 그것에 대해 어떻게 행동하는지 정확하게 알려줍니다.그것이 바로 관계형 데이터베이스입니다. 관련 데이터. –

+0

고마워요! 테이블에 많은 레지스터가 포함되어 있고 한 명의 사용자가 작성한 모든 항목을 확인하는 쿼리를 작성하는 것이 오래 걸릴 것이라고 생각했기 때문에 확실하지 않았습니다. – NMO

+0

@ user2615855 : 수백만 행을 효율적으로 검색 할 수 있도록 적절한 색인을 만들 수있는 곳입니다. 또한 짧은 기본 키 (INT와 같은)를 사용하면 효율성이 향상됩니다. 당신은 성능에 대해 염려하는 것이 옳지 만, 다른 테이블 각각에 대해 외래 키가있는 "연관성"테이블은 정확히 필요한 것입니다. "like"를 추가하거나 "like"를 제거하는 것은 매우 간단한 작업입니다. 해당 테이블의 기본 키는 두 외래 키의 조합 일 수 있지만 특성을 추가하기 시작하면 (예 : date_liked) ID 열을 PK로, UNIQUE를 – spencer7593

답변

0

당신은 당신이 당신이 언급 한 방식으로 테이블을 만들 수 있습니다 중 하나 일을하거나 {각 사용자가 저장 한 이미지를 표시하기 쉽게 만드는} 서로 다른 사용자에 대해 서로 다른 테이블을 만들 수 있습니다

당신은이 작업을 빠르고 덜 지저분하게 ID를 21와 사용자에 대한 테이블 21_savedimages을 가질 수 있습니다 예를 들어 <user_id>_savedimages 같은 테이블에 특정 명칭을 사용하지만이 데이터베이스에서 테이블을 많이 차례로 결과 수 있습니다.

사용자는 사용자 수와 평균 이미지 저장 수에 따라 결정할 수 있습니다.

1

사용자 당 하나가 아닌 하나의 연결 테이블 만 소개합니다.

  • 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)를 사용하여 고려할 수 있습니다.