2010-08-20 3 views
1

나는 그 쇼에서 연주 한 다른 모든 밴드들과 함께 밴드가 연주 한 것을 보여주는 페이지가 있습니다. 지금까지는 페이지를 직접 코딩 해 봤지만 모든 것을 표로 옮겨서 밴드 단위로 정렬 할 수 있도록/유지 보수하기 쉬웠습니다.많은 항목이있는 MySQL 필드

지금부터는 일반적인 항목이 예전 인 '아티스트'필드가 하나 있습니다. '브리트니 스피어스, 에어로 스미스, 니키 미나이.' 그러나 이것을 수행하는 더 똑똑한 방법이 있는지 궁금합니다. 자신의 분야에있는 각 아티스트의 라인을 따라 뭔가? (일부 공연은 3 개의 밴드가 있고 일부는 100 개의 밴드가 있다는 것을 명심하십시오. 실제로 100 개의 필드를 만드는 것은 불가능합니다.) 아니면 현재의 계획으로 충분합니까?

이쪽은 꽤 새롭기 때문에 일반적인 견해/올바른 방향으로의 포인트를 찾고 있습니다. 감사!

+0

먼저 사용하려는 API를 파악한 다음 자체에 속한 has_many 데이터베이스에 '아티스트'테이블 하나를 만들어야합니다. – s84

답변

4

당신은 시작할 수있는 간단한 대다 가입 - An Introduction to Database Normalization을보고하는 방법이 주제에 대한 좋은 소개를위한 Many-to-Many relationship with PHP and MySQL을 처리하는 방법. 예술가

  1. 테이블
  2. 장소에 대한 테이블
  3. 장소 예를 들어

에 예술가를 연결하는 테이블 :

그것은 간단한에서

, 세 개의 테이블이

event <---> event_artist <---> artist 

doi 이를 통해 중복을 줄이고 데이터베이스에서 유용한 정보를 추출 할 수있는 다양한 쿼리를 생성 할 수 있습니다. 다음은 MySQL InnoDB 테이블을 사용하는 간단한 예입니다.

먼저 이벤트 목록을 저장할 테이블을 만듭니다.

CREATE TABLE `event` (
    `id` INT NOT NULL , 
    `venue` VARCHAR(45) NOT NULL , 
    `date` DATE NOT NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

지금 예술가의 목록을 보유 할 테이블을 생성 : 각 이벤트는 고유 ID를 가져옵니다. 이제 이벤트 행이 아티스트 행에 링크 될 수있는 테이블이 필요

CREATE TABLE `artist` (
    `id` INT NOT NULL , 
    `name` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

: 이벤트와 마찬가지로, 각 작가는 고유 한 ID를 할당됩니다.이것은 다양하게 링크 테이블, 접합 테이블, 상호 참조 테이블 또는 교차 테이블이라고 불립니다. — 용어 접합 테이블을 선호합니다.

CREATE TABLE IF NOT EXISTS `event_artist` (
    `event_id` INT NOT NULL , 
    `artist_id` INT NOT NULL , 
    PRIMARY KEY (`event_id`, `artist_id`) , 
    INDEX `fk_event_artist_event` (`event_id` ASC) , 
    INDEX `fk_event_artist_artist` (`artist_id` ASC) , 
    CONSTRAINT `fk_event_artist_event` 
    FOREIGN KEY (`event_id`) 
    REFERENCES `event` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_event_artist_artist` 
    FOREIGN KEY (`artist_id`) 
    REFERENCES `artist` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

는 —들은, 말하자면, 존재하지 않는 이벤트에 대한 event_artist에 항목을 삽입에서 당신을 방지하여 데이터베이스 무결성을 유지하는 데 도움이 단지 아직 CONSTRAINT 부분에 대해 걱정하지 마십시오.

이제 일부 데이터를 삽입 할 수 있습니다. 첫째, 일부 이벤트 :

INSERT INTO `event` (`id`, `venue`, `date`) VALUES 
(1, 'Roadhouse', '2010-08-19'), 
(2, 'Night & Day Café Music Venue', '2010-08-20'), 
(3, 'Night & Day Café Music Venue', '2010-08-25'), 
(4, 'The Bridgewater Hall', '2010-09-03'); 

이제 일부 작가 : 마지막으로

INSERT INTO `artist` (`id`, `name`) VALUES 
(1, 'Starving Dogs'), 
(2, 'The Black and Reds'), 
(3, 'Caitlin Rose'), 
(4, 'A Little Bite Music - Bella Hardy'); 

, 우리는 이벤트와 예술가에 가입 할 수 있습니다 :이 아주 간단한 예에서

INSERT INTO `event_artist` (`event_id`, `artist_id`) VALUES 
(1, 1), (2, 2), (3, 3), (4, 4); 

, ID 1과 아티스트 ID 1 인 이벤트에서, 아티스트 ID 2가 이벤트 ID 2에서 재생 중입니다. 그러나 보시다시피 여러 아티스트가 여러 이벤트를 진행할 가능성이 있습니다.

이제 이러한 테이블에서 정보를 추출 할 방법이 필요합니다. 이 작업을 수행하는 가장 간단한 방법 중 하나는 JOIN 함께 :

SELECT 
    event.venue AS event_venue, 
    event.date AS event_date, 
    artist.name AS artist_name 
FROM event_artist 
JOIN event ON event.id = event_artist.event_id 
JOIN artist ON artist.id = event_artist.artist_id; 

+------------------------------+------------+-----------------------------------+ 
| event_venue     | event_date | artist_name      | 
+------------------------------+------------+-----------------------------------+ 
| Roadhouse     | 2010-08-19 | Starving Dogs      | 
| Night & Day Café Music Venue | 2010-08-20 | The Black and Reds    | 
| Night & Day Café Music Venue | 2010-08-25 | Caitlin Rose      | 
| The Bridgewater Hall   | 2010-09-03 | A Little Bite Music - Bella Hardy | 
+------------------------------+------------+-----------------------------------+ 

이 예를 개선 할 수있는 방법이 있습니다. event 테이블이 쉽게 장소 이름 중복을 일으킬 수 있습니다. 집회 장소를 별도의 테이블로 분리하여 집회 장소 (주소, 전화 번호, 웹 사이트 등), 행사 테이블 (행사 날짜, 시간, 티켓 가격 등)을 담은 장소 테이블을 가질 수 있습니다. ,), 그리고 아티스트 테이블.

UPDATE

당신은 하나의 행으로 그룹에 여러 행의 값을 MySQL을 사용 할 수 있습니다

. 그러나 이런 종류의 것은 실제로보기/표시 문제이므로 응용 프로그램에서 일반적으로 수행되는 작업입니다. 나는 위의 쿼리에서 날짜를 떠난

SELECT 
    event.venue AS event_venue, 
    GROUP_CONCAT(artist.name) AS artists 
FROM event_artist 
JOIN event ON event.id = event_artist.event_id 
JOIN artist ON artist.id = event_artist.artist_id 
GROUP BY (event.venue); 

+------------------------------+-----------------------------------+ 
| event_venue     | artists       | 
+------------------------------+-----------------------------------+ 
| Night & Day Café Music Venue | The Black and Reds,Caitlin Rose | 
| Roadhouse     | Starving Dogs      | 
| The Bridgewater Hall   | A Little Bite Music - Bella Hardy | 
+------------------------------+-----------------------------------+ 

참고 : 갖는 간단한 경우에, 당신은 MySQL의 [GROUP_CONCAT][5] 기능을 사용할 수 있다고 말했다. 여기에 제공된 샘플 데이터에서 밤 & 데이 카페의 두 아티스트는 다른 날짜에 나타납니다. 위의 쿼리에 날짜 열이 포함되어있는 경우 MySQL은 두 날짜 중 하나를 선택해야하며 어떤 날짜가 표시 될지에 대해서는 제어 할 수 없습니다.

+0

+1 시간을내어 포괄적이고 자세한 설명을 게시 할 수 있습니다. –

+0

+1 아마도 내가 본 가장 구체적인 대답 일 것입니다. – Nick

+0

대단히 감사합니다! 실제로 나를 위해 단계를 겪어 주셔서 감사합니다. 내가 할 수 있으면이 대답을 투표 할거야! – user426037

0

나에게 많은 관계가있는 것처럼 들립니다. 그것에 대해 읽어보십시오.

1

아이디어는 단지 1 개가 아닌 여러 개의 테이블로 데이터를 분할하는 것입니다. 귀하의 경우에는 artists 테이블과 shows 테이블을 보유하게됩니다. 세 x 째 테이블은이 2 개의 테이블을 연결하기 때.에 접합 테이블이라고합니다. 간단한 예 :

| show id | artist id | 
| 1  | 5   | 
| 1  | 7   | 
| 2  | 3   | 

ID가 예술가의 기본 키이고 테이블을 보여줍니다.

0

당신은 3 개 테이블을 만들어야합니다

<<Bands>> 
<band_id>, <band_name>, <band_info> 
<<Shows>> 
<show_id>, <show_name>, <show_info> 
<<Plays>> 
<play_id>, <play_show_id>, <play_band_id> 

모든 밴드 정보를 입력하고 쇼 (장소를). 다음 밴드가 쇼에서 연주 될 때마다 코드를 Plays 테이블에 입력하면됩니다.