가장 흔한 1:N 관계 예제로 게시글(BOARD) – 댓글(COMMENT) 을 사용해 두 방식의 차이를 살펴본다.
DROP TABLE IF EXISTS comment_non_identifying;
DROP TABLE IF EXISTS board_non_identifying;
CREATE TABLE board_non_identifying (
board_id BIGINT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
PRIMARY KEY (board_id)
);
CREATE TABLE comment_non_identifying (
comment_id BIGINT NOT NULL AUTO_INCREMENT, -- 독립적인 PK
board_id BIGINT NOT NULL, -- 일반 컬럼 + FK
content TEXT NOT NULL,
PRIMARY KEY (comment_id),
CONSTRAINT fk_comment_board_non
FOREIGN KEY (board_id)
REFERENCES board_non_identifying (board_id)
);
comment_id가 댓글의 대리 키 PK이다.board_id는 어느 게시글에 달렸는지 알려 주는 FK 컬럼일 뿐, PK에는 포함되지 않는다.-- 게시글 입력
INSERT INTO board_non_identifying (title) VALUES ('첫 번째 게시글'); -- board_id: 1
INSERT INTO board_non_identifying (title) VALUES ('두 번째 게시글'); -- board_id: 2
-- 댓글 입력
INSERT INTO comment_non_identifying (board_id, content)
VALUES (1, '1번 글의 첫 댓글입니다.'); -- comment_id: 1
INSERT INTO comment_non_identifying (board_id, content)
VALUES (1, '1번 글의 두 번째 댓글입니다.'); -- comment_id: 2
INSERT INTO comment_non_identifying (board_id, content)
VALUES (2, '2번 글의 첫 댓글입니다.'); -- comment_id: 3
board_non_identifying
| board_id | title |
|---|---|
| 1 | 첫 번째 게시글 |
| 2 | 두 번째 게시글 |
comment_non_identifying
| comment_id | board_id | content |
|---|---|---|
| 1 | 1 | 1번 글의 첫 댓글입니다. |
| 2 | 1 | 1번 글의 두 번째 댓글입니다. |
| 3 | 2 | 2번 글의 첫 댓글입니다. |
각 댓글은 comment_id 하나만으로 완전히 식별된다. board_id는 소속을 나타내는 정보일 뿐이다.
comment_id 하나면 조회·수정·삭제가 모두 가능하다.board_id FK만 바꾸면 된다.