팀과 회원의 관계를 다시 보자.
이 관계를 어느 쪽 관점에서 보느냐에 따라 이름이 달라진다.
같은 현실 세계의 관계를 두고, 바라보는 방향에 따라 이름이 달라질 뿐이다. 논리적 모델링에서 중요한 것은 이 관계를 FK로 어떻게 구현하는가이다.
관계형 데이터베이스에서 일대다/다대일 관계를 표현할 때 외래 키는 항상 N쪽에 위치해야 한다.
member 테이블이 team_id 외래 키를 가진다.team 테이블이 회원 ID를 직접 가진다고 상상해 보자.
DROP TABLE IF EXISTS team_bad1;
CREATE TABLE team_bad1 (
team_id BIGINT NOT NULL,
name VARCHAR(50) NOT NULL,
member_id BIGINT NULL,
PRIMARY KEY (team_id)
);
-- 데이터 삽입
INSERT INTO team_bad1(team_id, name, member_id)
VALUES (1, '개발팀', 1); -- 김개발(ID:1)
-- 같은 팀에 두 번째 회원을 넣으려고 시도
INSERT INTO team_bad1(team_id, name, member_id)
VALUES (1, '개발팀', 2); -- 박개발(ID:2)
이상적으로는 다음과 같은 형태를 기대할 수 있다.
| team_id | name | member_id |
|---|---|---|
| 1 | 개발팀 | 1 |
| 1 | 개발팀 | 2 |
하지만 실제 실행 결과는 다음과 같은 오류가 발생한다.
Error Code: 1062. Duplicate entry '1' for key 'team_bad1.PRIMARY'
이유는 간단하다.