3-1. 기본 구조

먼저 회원과 회원 프로필을 일대일로 나누어 설계한다.

CREATE TABLE member (
  member_id BIGINT PRIMARY KEY,
  name      VARCHAR(50) NOT NULL
);

CREATE TABLE member_profile (
  member_id BIGINT PRIMARY KEY,
  intro     TEXT,
  mbti      VARCHAR(4),
  CONSTRAINT fk_member_profile_member
    FOREIGN KEY (member_id) REFERENCES member(member_id)
);

이 구조에서는:

즉, 자연스럽게 member 1 : 0..1 member_profile 관계를 표현한다.


3-2. 새로운 요구 사항: 프리미엄 회원 정보 추가

시간이 지나면서 다음과 같은 요구 사항이 생긴다고 가정한다.

"일부 회원은 프리미엄 요금을 내고 있고, 프리미엄 전용 정보를 추가로 저장하고 싶다."

프리미엄 정보 예시:

이때 기존 member 테이블을 수정하지 않고, 새로운 1:1 테이블을 하나 더 붙이는 방식으로 확장할 수 있다.

CREATE TABLE member_premium (
  member_id      BIGINT PRIMARY KEY,
  started_at     DATETIME NOT NULL,
  expired_at     DATETIME,
  manager_name   VARCHAR(50),
  CONSTRAINT fk_member_premium_member
    FOREIGN KEY (member_id) REFERENCES member(member_id)
);

이제 한 회원은 다음과 같은 관계를 가진다.