3-1. 1:N 과 N:1은 같은 관계이다

팀과 회원의 관계를 다시 보자.

이 관계를 어느 쪽 관점에서 보느냐에 따라 이름이 달라진다.

같은 현실 세계의 관계를 두고, 바라보는 방향에 따라 이름이 달라질 뿐이다. 논리적 모델링에서 중요한 것은 이 관계를 FK로 어떻게 구현하는가이다.

3-2. 외래 키는 항상 "다(N)" 쪽에 둔다

관계형 데이터베이스에서 일대다/다대일 관계를 표현할 때 외래 키는 항상 N쪽에 위치해야 한다.

잘못된 설계 1: 1쪽에 여러 행으로 나누어 보관

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'

이유는 간단하다.