리비전은 차이가 아니라 행 전체
post_revisions 는 매번 제목과 본문을 통째로 저장합니다. 저장 공간을 쓰는 대신 중요한 것을 얻습니다 — 어느 판본이든 질의 한 번으로 읽고 되돌릴 수 있고, 되감기가 없습니다. 글 정도 크기에서는 거의 언제나 맞는 거래입니다. 차이 사슬은 문서가 아주 크거나 리비전이 아주 많을 때 값어치가 있는데, 블로그는 둘 다 아닙니다.
워드프레스와 같은 플랫폼을 위해 설계된 블로그 및 콘텐츠 관리 시스템 데이터베이스입니다. 역할 기반 액세스를 제공하는 다중 작성자 지원, 계층적 카테고리, 다대다 태그 관계, 중첩된 댓글(대댓글) 및 콘텐츠 버전 관리 기능을 포함합니다. 맞춤형 CMS 솔루션, 블로깅 플랫폼 또는 지식 베이스 구축에 적합합니다.
편집이 취미가 아니라 일이 되면 콘텐츠 시스템은 이 모양으로 자리 잡습니다. posts 는 지금의 글을, post_revisions 는 그 전의 모든 판본을 담고, 둘이 나뉘어 있어서 블로그를 읽는 동안에는 히스토리를 건드리지 않습니다.
댓글은 계정이 없는 사람이 씁니다. author_name 과 author_email 이 users 를 가리키지 않고 댓글 행에 그대로 있고, is_approved 가 공개를 막습니다. 이것이 회원제 사이트가 아니라 공개 블로그인 지점입니다 — 익명 댓글이 급조된 사용자 레코드가 아니라 그 자체로 온전한 행입니다.
나머지는 대체로 흔한 살림살이인데, 하나는 눈여겨볼 만합니다. settings 가 updated_by 를 가진 키-값 테이블입니다. 사이트 설정이 파일이 아니라 데이터베이스에 있어서 편집자가 바꿀 수 있고, 누가 바꿨는지를 컬럼이 기록합니다.
post_revisions 는 매번 제목과 본문을 통째로 저장합니다. 저장 공간을 쓰는 대신 중요한 것을 얻습니다 — 어느 판본이든 질의 한 번으로 읽고 되돌릴 수 있고, 되감기가 없습니다. 글 정도 크기에서는 거의 언제나 맞는 거래입니다. 차이 사슬은 문서가 아주 크거나 리비전이 아주 많을 때 값어치가 있는데, 블로그는 둘 다 아닙니다.
댓글마다 사용자 행을 요구하면 아무도 원하지 않은 계정이 생기고, 스팸을 지우는 일이 회원 탈퇴가 됩니다. 이름과 이메일을 댓글에 두면 신원이 쓰이는 자리에 그대로 있고, 계정이 아예 없어도 검수가 됩니다.
category_id 는 글의 컬럼이고 태그는 연결 테이블을 거칩니다. 일부러 비대칭으로 뒀습니다. 분류는 글이 사는 곳이라 URL 과 내비게이션을 정하고, 태그는 붙이는 이름표라 여럿일 수 있습니다. 둘 다 다대다로 만들면 "모든 글은 집이 하나" 라는 보장이 사라집니다.
status 는 초안·예약·공개를, published_at 은 시각을 말합니다. 둘 다 있으면 예약이 그냥 미래 시각이 되고, 내렸다가 다시 올린 글도 원래 날짜를 지킵니다. 상태 컬럼 하나만 두면 예약이 생기는 순간 어차피 두 번째 컬럼이 필요해집니다.