당신은 시작할 수있는 간단한 대다 가입 - An Introduction to Database Normalization을보고하는 방법이 주제에 대한 좋은 소개를위한 Many-to-Many relationship with PHP and MySQL을 처리하는 방법. 예술가
- 테이블
- 장소에 대한 테이블
- 장소 예를 들어
에 예술가를 연결하는 테이블 :
그것은 간단한에서
, 세 개의 테이블이
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은 두 날짜 중 하나를 선택해야하며 어떤 날짜가 표시 될지에 대해서는 제어 할 수 없습니다.
먼저 사용하려는 API를 파악한 다음 자체에 속한 has_many 데이터베이스에 '아티스트'테이블 하나를 만들어야합니다. – s84