2014-06-19 2 views
0

테이블이 있습니다. 그것은 두 개의 열 unique songgenre을 cointains. 고유 한 노래는 문자열을 저장하지만 실제로는 상관 없습니다.mySQL 열에 임의 크기 배열 저장

Genres에는 문자열 배열 (노래에 적용되는 장르)이 포함되어 있으며 문자열의 요소 수는 무작위입니다 (배열을 버리고 추가 열을 만들기 위해 커다란 숫자로).

내가 설정 한대로이 설정이 mySQL에서 작동하지 않는다는 것을 알고 있지만 그것이 내가 필요한 것입니다.

한 가지 방법은 직렬화 일 것이지만 우선 모든 음악을 쿼리하고 직렬화를 해제 한 다음 내 검색을 찾지 않고 모든 록 노래를 쿼리 할 수 ​​있기를 바랄 것입니다.

모든 배열 내용이 같은 유형이므로이 입력을 지원하는 열이 있습니까? (int는 제한된 int 배열입니다.)

+3

스키마를 다시 디자인하기에는 너무 늦습니까? 배열을 열에 배치하는 것은 매우 안 좋은데 관계 테이블을 사용해야합니다. – Barmar

+0

'implode()'를 사용하여 쉼표로 구분 된 목록을 열에 저장할 수 있습니다. 컬럼을 조회하고자 할 때,'FIND_IN_SET()'을 사용하여 값이리스트에 있는지 확인할 수 있습니다. 그러나이 작업은 매우 어려워 복잡한 쿼리를 거의 불가능하게 만듭니다. – Barmar

+0

나는 추가 테이블을 사용할 수는 있지만, 생각해 보면 실제로 작동하지 않을 것입니다. 문제는 첫 번째 테이블에는 행마다 다중 장르가있을 수 있다는 것입니다. 장르 테이블을 만들면 장르마다 여러 곡이 다시 시작됩니다. – Karlovsky120

답변

3

하나의 노래는 여러 장르를 가질 수 있으며 장르는 여러 노래에서 사용할 수 있습니다.

노래 및 고유 식별자에 대한 정보가 들어있는 노래라는 표를 만듭니다. 논쟁을 위해서, 우리는 그것이 노래의 이름 : s_name이라고 말할 것입니다.

장르에 대한 정보가 들어있는 장르라는 테이블을 만듭니다. 아마도 당신은 장르와 어떤 음악 스타일인지에 대한 정보를 가지고있을 것입니다.

마지막으로 SongAndGenre라는 테이블을 만들어 브리지 테이블의 역할을합니다. 노래 ID (이 경우 s_name)와 장르 ID (예 : g_name)의 두 열이 있습니다. 노래 S에 여러 장르 G1 및 G2가있는 경우 해당 노래에 대해 (S, G1) 및 (S, G2)의 두 행을 갖게됩니다.

+0

그래서 세 번째 테이블은 연결 인덱스와 같을 것이고 s_name은 * somesong * 인 모든 g_name을 찾고 모든 genreas를 * somesong *에 연결할 것입니다. 네, 그게 제가 찾고 있었던 바로 그 것입니다. 고맙습니다! – Karlovsky120

1

songs 테이블에 genres이 포함되어 있습니다.

는 지금

SELECT genres FROM songs WHERE id = 123; 

은 무엇 당신이해야 할 것은 두 개의 추가 테이블을 만드는 것입니다 실행할 수, 노래 # 123의 장르를 알고 :

CREATE TABLE genres (
    genre_id integer not null primary key auto_increment, 
    genre_name varchar(75) 
); 

CREATE TABLE song_has_genre (
    song_id integer not null, 
    genre_id integer not null 
); 

이 사실을 저장하려면를 그 노래 (123) 장르 '민속', '팝', '재즈'와 '무엇이든'에, 당신은 실행할 수 있습니다

INSERT INTO song_has_genre 
    SELECT 123, genre_id FROM genres 
    WHERE genre_name IN ('Folk', 'Pop', 'Jazz', ...); 

난을 어떤 노래를 조회하려면 n 개의 장르 포크,

SELECT songs.*, genres.genre_name FROM songs 
    JOIN song_has_genre AS shg ON (songs.id = shg.song_id) 
    JOIN genres ON (shg.genre_id = genres.genre_id) 
    WHERE genres.genre_name = 'Folk'; 

약간 더 많은 작업이 두 장르를 선택하고 하나의 노래가 모두있는 경우 중복을 피하기 위해, 또는 장르에 따라 선택 일부 곡의 모든 장르를 검색하는 데 필요한 (즉, 당신은 '검색 Pop ','Pop, Whatever '은 찾았지만'Techno, Jazz, Folk, Pop을 제외한 다른 것 '은 아니지만)'Pop, Jazz, Folk ','Pop, Techno ','Pop ' 예 GROUP_CONCAT 및/또는 GROUP BY을 사용하거나 MySQL 외부의 코드에서).