2012-05-05 3 views
0

사용자가 좋아하는 음악 장르를 선택할 수있는 새로운 웹 사이트 용 데이터베이스를 설계하고 있습니다. 각 장르마다 관련 ID가 있으므로 John, Pop, Rock 및 R & B를 좋아하는 사람은 1, 2 및 3을 좋아합니다.MySQL 테이블에 이러한 여러 값을 어떻게 저장해야합니까?

사용자 테이블에 저장하는 가장 좋은 방법은 무엇입니까?

genre_id | user_id 
------------------ 
1,2,3 | 1 

을하고 PHP에서 나는 쉼표 분리 문자에이 값을 폭발 그런 식으로 개별 ID를 잡아 :

는 지금은이처럼이있다. 그러나 이것은 분명히 그것에 대해 올바른 방법이 아닙니다.

은 내가 "genre_to_user"라는 별도의 테이블을 가질 수 있습니다 알고 각 장르 요한은 내가 너무 좋아하는 테이블에 항목을 입력 할 수 있습니다 추천했습니다 :

genre_id | user_id 
------------------ 
1  | 1 
2  | 1 
3  | 1 

그리고 요한은 내가 할 수있는 좋아하는 모든 것들을 얻을 수 do SELECT * FROM 'genre_to_user where user_id = 1

하지만 장기적으로 볼 때이 테이블이 엄청난 수의 레코드로 채워지는 경우에는 그렇게 효율적이지 않을 것이라고 생각합니다. 그리고 같은 페이지에 최대 30 명의 사용자가있는 목록 페이지의 각 사용자에 대해이 계산을 한 번 수행 할 것입니다. 이 페이지는 사이트 전체에 걸쳐 있습니다.

그렇다면이 문제를 해결하는 가장 좋은 방법은 무엇입니까 (효율적인)?

또한 mysql에 varchar 필드 안에 쉼표로 구분 된 값을 저장하는 대신 모든 데이터 유형이 저장되어 있습니까?

+3

"엄청난 수의 레코드"- 얼마나 많은 부분이 있습니까? 왜냐하면 나는 사용자가 선택할 수있는 700 만 개의 별개의 장르를 의심하기 때문입니다. 인덱스가 예상 한대로 작동하게하십시오 (심지어 700 만 개는 데이터베이스에별로 도움이되지 않습니다). – Blake

+3

사실, 내가 언급 한 두 번째 해결책이 아마도이 문제를 해결하는 가장 좋은 방법이라고 생각합니다. 일반적으로 user_id 열에 인덱스가 있으므로 검색 속도가 매우 빠릅니다. –

답변

4

설명하는 genre_to_user과 같은 상호 참조 테이블을 사용해야합니다. 이렇게하면 데이터베이스가 레코드를 검색하는 속도가 훨씬 빨라집니다.

, 즉 데이터베이스가 당신이 설명 genre_to_user 같은 상호 참조 테이블을 만들기 :-)

0

위한 무엇 "기록의 엄청난 숫자"에 대해 너무 많이 걱정하지 마십시오로 검색을 허용하는 추가 혜택이있다 거꾸로된다. 다시 말해, genre_id가 1 인 사용자 또는 사용자 수를 알 수 있습니다.

+0

이것은 질문에 대한 완전한 대답으로 간주 될 수 없기 때문에 주석에 더 적절합니다. – dkar

관련 문제