1:N 관계에서는 보통 외래 키(FK)를 **"N 쪽"**에 둔다. 하지만 1:1 관계에서는 양쪽 모두 최대 1개이기 때문에, 다음처럼 선택지가 생긴다.
이때 설계에서 가장 중요한 질문은 다음과 같다.
"두 테이블 중에서 어느 쪽이 주(主) 테이블이고, 어느 쪽이 부가(상세) 테이블인가?"
실무에서는 보통:
member)member_profile, member_sensitive)로 보고, 상세 테이블이 주 테이블을 FK로 참조하는 방식을 사용한다.
CREATE TABLE member (
member_id BIGINT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE member_profile (
member_id BIGINT PRIMARY KEY, -- PK 이자 FK
intro TEXT,
CONSTRAINT fk_member_profile_member
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
이 설계에서는 다음이 보장된다.
member_profile.member_id는 항상 이미 존재하는 회원만 가리킨다.member_profile에 행이 없으면 된다.반대로, 주 테이블에 FK를 두면 여러 문제가 생긴다.
CREATE TABLE member (
member_id BIGINT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
profile_id BIGINT, -- 프로필 테이블 FK
CONSTRAINT fk_member_profile
FOREIGN KEY (profile_id) REFERENCES member_profile(id)
);
이 구조는 다음과 같은 단점이 있다.
profile_id 컬럼이 항상 따라다닌다.