관계·정규화

작성자와 글을 표로 나누고 다시 붙입니다.

한 칸에 하나의 값

글마다 작성자 이름과 이메일을 본문에 반복해 넣으면, 이메일이 바뀔 때 그 사람의 모든 글을 고쳐야 한다. 작성자는 표로 나누고, 글은 작성자의 번호만 가진다.

create table authors (
  id bigint generated always as identity primary key,
  name text not null,
  email text not null unique
);

alter table posts
  add column author_id bigint references authors (id);

references authors (id)는 외래 키다. posts.author_id에는 authors.id에 있는 값만 들어간다. 없는 번호를 넣으면 Postgres가 거절한다.

두 표를 같이 읽기

select posts.title, authors.name
from posts
join authors on authors.id = posts.author_id;

join은 글의 author_id와 작성자의 id가 같은 행을 붙인다. 작성자가 없는 글은 이 결과에 나오지 않는다. 그것도 보려면 left join을 쓴다.

정규화, 세 단계만

  • 1정규형: 칸 하나에는 값 하나. 작성자를 ‘김, 이’처럼 한 칸에 여러 명 넣지 않는다.
  • 2정규형: 기본 키가 열 하나면, 다른 열은 그 키 전체에 매인다. posts.id만으로 제목이 정해지면 된다.
  • 3정규형: 작성자 이메일은 글 번호가 아니라 작성자에 매인다. 그래서 posts가 아니라 authors에 둔다.

나눈 뒤에도 화면에서는 한 줄로 보여야 하면, 그때 join한다. Supabase에서는 이 외래 키가 있어야 관계로 같이 읽을 수 있다.