영화와 시리즈가 카탈로그 한 테이블을 쓴다
영화 테이블과 시리즈 테이블로 나누면 카탈로그 질의가 전부 두 배가 됩니다 — 검색·장르·찜·평가가 모두 union 이 됩니다. 타입 컬럼을 두고 시즌·에피소드를 시리즈만 쓰게 하면 카탈로그가 하나로 유지됩니다. 대가는 content 의 duration_minutes 가 시리즈에서는 의미가 없다는 것인데, nullable 컬럼 하나와 질의 표면의 중복을 맞바꾼 셈입니다.
콘텐츠 관리, 다중 프로필 지원, 구독 결제, 시청 기록, 평점, 추천 엔진 및 다운로드 기능을 포함하는 넷플릭스 스타일의 비디오 스트리밍 플랫폼을 위한 전체 데이터베이스 스키마입니다.
이 스키마를 가르는 구분은 계정과 시청자입니다. users 는 결제하고 로그인하는 주체, profiles 는 보고 있는 사람입니다. 개인적인 것 — 시청 기록, 찜, 평가, 다운로드 — 이 전부 프로필에 붙고, 그래서 한 집의 추천이 다른 사람에게 새지 않습니다.
카탈로그는 둘이 아니라 타입을 가진 한 테이블입니다. content 가 영화와 시리즈를 함께 담고, seasons 와 episodes 는 타입이 요구할 때만 붙습니다. 영화는 시즌이 없는 content 행이고 시리즈는 있는 content 행입니다. 검색·평가·찜이 전부 content 위에서 돌고 어느 쪽인지 알 필요가 없습니다.
watch_history 가 content 와 episode 를 둘 다 가리키는데, 시리즈의 이어보기가 이것으로 됩니다. content_id 가 "무엇을 보는 중인가", episode_id 가 "어디까지 왔나", progress_seconds 가 "그 안에서 얼마나" 에 답합니다.
영화 테이블과 시리즈 테이블로 나누면 카탈로그 질의가 전부 두 배가 됩니다 — 검색·장르·찜·평가가 모두 union 이 됩니다. 타입 컬럼을 두고 시즌·에피소드를 시리즈만 쓰게 하면 카탈로그가 하나로 유지됩니다. 대가는 content 의 duration_minutes 가 시리즈에서는 의미가 없다는 것인데, nullable 컬럼 하나와 질의 표면의 중복을 맞바꾼 셈입니다.
시청 기록과 평가가 users 에 있으면 한 집이 하나의 뒤섞인 취향과 하나의 이어보기 지점을 갖게 됩니다. profiles 에 두는 것이 프로필이 존재하는 이유 전부입니다. 결과적으로 프로필을 지우면 그 기록이 사라지는데, 사람들이 프로필을 지울 때 기대하는 것이 그것입니다.
배우 테이블과 감독 테이블을 따로 두지 않고 content_cast 가 role·character_name·billing_order 를 듭니다. 같은 사람이 작품마다 다른 자격으로 등장하므로, 자격은 크레딧의 속성입니다. billing_order 를 저장하는 이유는 작품 페이지의 순서가 가나다순이 아니라 편집 결정이기 때문입니다.
max_profiles·max_streams·video_quality 를 코드에 박지 않고 subscription_plans 에 둡니다. 등급이 포함하는 것을 바꾸는 일이 행 갱신이 되고, 옛 요금제 행을 가리키는 구독은 옮기기 전까지 옛 조건을 유지합니다.