2011-01-09 2 views
1

그래서 비디오와 태그를 처리하기 위해 다소 큰 데이터베이스를 설계하려고합니다. 비디오 (27)에 대해 한정된 수의 태그 만 선택할 수 있으므로이 태그를 28 열 너비 (각 태그 당 하나의 열 + video_id)에 저장합니다.MySQL : 열 vs. 쿼리 더보기

사용자가 특정 태그 (예 : # 24)로 동영상을 좋아요/싫어하는 횟수를 얻고 싶을 때 문제가 발생합니다. 각각의 Like/Dislike는 다른 테이블에서 하나의 행을 가져옵니다.

다음은 내가 고려한 두 가지 옵션입니다.

1) 사용자 테이블에 27 개의 tinyint 열을 추가합니다. 각각은 tagX로 비디오에 투표 한 횟수를 나타냅니다.
PRO : 쉽게
CON 선정은 : 크기 작은
CON을 유지 : 열심히 시스템

모두를 각 사용자

2)를 사용하여 내부가
은 PRO 조인에 필요한 데이터의 양을 두 배로 나는 optomistic하고 좋은 연습을 사용하려고하기 때문에 300,000 이상의 사용자를 위해 데이터베이스를 최적화하려고 노력하고 있으며이 수치는 많이 필요할 것입니다. 나는 수학을했고 300,000 명의 사용자들조차도 데이터베이스에 약 27 메가 바이트 만 추가했습니다.

무엇을할까요?!

답변

0

27 사용자 테이블에 대한 열은 27 개의 다른 태그가있는 경우에만 작동합니다. 따라서 다른 태그를 추가하면 스키마 변경이 필요합니다 (이는 나쁜 것임).

나는 이런 식 투표 : 조언을

select c.tag_name 
     ,count(*) 
    from user_likes a 
    join video_tags b uing(video_id) 
    join tags  c using(tag_id) 
where a.user_id = ? 
group 
    by c.tag_name; 
4

(이 단지 내 의견)

난 당신이 너무 일찍 (아마도 잘못) 최적화 것 같아요. 조인은 그렇게 비싸지 않습니다. 사용자 테이블, 태그 테이블 및 이와 유사한 테이블이 있어야합니다. 정확한 질의에 따라, 당신은 아마 이것보다 조금 비싸다는 것을 알게 될 것입니다.

유지 관리보다 성능 향상을 위해 설계된 레이아웃을 만드는 것보다 올바른 인덱스를 확보하는 것이 더 좋습니다.

+0

감사 :

table users( user_id ,primary key(user_id) ); table videos( video_id ,primary key(video_id) ); table tags( tag_id ,tag_name ,primary key(tag_id) ); table video_tags( video_id ,tag_id ,primary key(video_id, tag_id) ); table user_likes( user_id ,video_id ,primary key(user_id, video_id) ); 

, 당신은 같은 것을 할 것입니다 태그 당 투표 수를 표시하려면! 나는 분명히 이것을 할 것이다. – DropDeadFred81

1

귀하의 변덕스러운 합리성에는 결함이 있습니다. 오늘은 27 개의 동영상이 최대다고 생각할 수 있지만 앞으로는 항상 1 ~ 2 개의 동영상이 더있을 것입니다.