개발자로 후회없는 삶 살기

DB 설계 PART.네이버 영화 ERD 설계 본문

[백엔드]/[DB | 학습기록]

DB 설계 PART.네이버 영화 ERD 설계

몽이장쥰 2023. 6. 8. 11:50

서론

※ 이 포스트는 다음 강의의 학습이 목표임을 밝힙니다.

https://www.youtube.com/playlist?list=PL9hiYwOHVUQduJN7Pf_kOR8htpJU7K1H8 

 

2020 데이터베이스

 

www.youtube.com

 

본론

그 동안 배운 것을 활용하여 네이버 영화 DB를 분석하고 ERD를 그려보겠습니다. 먼저 기획자가 기획을 하고 개발자가 그 기획서를 보고 요구사항을 분석하여 기능을 리스트업하고 ERD를 그리는 단계입니다.

 

- ERD 그리기

네이버 영화 기획에 맞게 ERD를 그립니다. 요구사항에 대한 리스트를 상세하게 작성할 수도 있지만, 먼저 카테고리를 작성하고, 그 다음에 상세하게 요건들을 작성하면 좋습니다.

 

-> 카테고리

1. 영화 소개
2. 영화 출연진
3. 평점, 리뷰

 

-> 엔터티

1. 영화
2. 관객
3. 영화인

 

카테고리를 보고 큰 틀이 될 엔터티를 설계합니다.

 

-> 관계

오른쪽 : 4개의 테이블

큰 틀의 관계를 설정합니다. 현재 영화 리뷰 ERD를 설계하는 것이므로 관객과 영화는 M:N 관계이며, 관객이 영화를 관람할 때의 관객 + 관람 + 관람목록 + 영화 4개의 테이블이 생기는 관계가 아닙니다.

 

-> 속성

엔터티에 들어갈 속성들을 적습니다. 영화를 보면 제목, 영어제목, 제작년도, 평점등이 있습니다.

 

=> 세부 테이블 및 세부 속성 작성

그 동안 배웠던대로 큰 틀을 잡고 관계, 속성을 정의했습니다. 이제 세부 테이블과 속성을 작성하고 정규화를 고려하면 됩니다. 세부 속성은 큰 틀에 요구사항에 있는 기능들을 끼워 넣으면 됩니다. 아래부터는 다양한 고려 사항을 적용해봅니다.

 

1. 영화 테이블의 내 평점

'내 평점'은 영화의 속성일까요? 내 평점은 로그인한 사용자 평점으로 내 평점은 회원과 영화의 장바구니처럼 평점 목록 테이블(매핑 테이블)을 만들고 넣을 수 있습니다.

 

내 평점이 관객 테이블에 있어야 하는 거 아닌가요? ✅

 

관객 테이블에 평점이 있으면 한 관객이 M개의 영화에 평점을 가질 수 없습니다. 따라서 관객_영화 맵핑 테이블에 평점을 가집니다. M:N일 때 한쪽이 한개의 컬럼만 가지면 맵핑 테이블이 된다고 했는데 현재 관객은 간소화한 것이지 id만 가지는 것이 아닙니다.

 

2. 영화 테이블 개요

개요는 개요라는 컬럼에 드라마 | 한국 | ㆍㆍㆍㆍ 이렇게 들어가있을까요? 텍스트로 들어있으면 컬럼 하나에 들어가도 되는데 그렇지 않고 링크로 들어있습니다. 그러면 영화에 장르가 컬럼으로 있을까요? 그것도 아닌게 한 영화에 장르가 여러개인 것도 있습니다. 그러니 M:N관계로 빼야합니다. 이렇게 필요한 요소들을 큰 틀(기존)의 테이블과 관계를 알아보며 끼워 넣는 것입니다.

 

M:N도 선택하는 순서에 따라 관계가 다른데 영화를 먼저 찍으면 '이 영화에 어떤 장르들이 있냐'를 말하고 장르먼저 찍으면 '해당 장르에는 어떤 영화들이 있냐'를 나타냅니다. 무엇을 중점에 두고 테이블을 만드느냐에 따라 다르며 정답은 사용자가 더 많이 사용하는 쿼리에 맞추는 것입니다. '사용자가 영화를 통해 장르를 클릭하나', '장르를 통해 영화를 클릭하나'에 따라서 관점이 다릅니다. 현재는 영화를 통해 장르를 보는 빈도수가 더 많을 것으로 진행합니다.

 

국가도  장르처럼 여러개인 영화가 많아서 국가 테이블을 만들고 영화와 M:N 관계를 가집니다.

 

-> 영화 테이블의 감독 컬럼

감독도 영화 테이블의 컬럼에 속할 것 같습니다. 하지만 틀렸습니다. 감독은 '영화인' 테이블로 영화 ERD는 영화, 영화인, 영화사가 가장 큰 틀입니다. '배우로 참여했냐', '스탭으로 참여했냐', '감독으로 참여했냐' 등 무엇으로 참여했나는 영화인 테이블에 들어갑니다.

 

4. 영화 테이블 줄거리

영화 테이블에 줄거리가 있는데 줄거리에 제작 노트라는 게 있습니다. 제작노트는 여러개 있을 수도 있어서 영화 테이블과 1:N 관계를 가져서 포함 관계를 만듭니다. 이렇게 하면 영화번호 속성과 제작노트 테이블의 영화 번호 속성을 조인해서 여러 제작노트를 조회할 수 있습니다.

 

-> 영화인

영화인은 해당 영화에 참여한 사람에 해당하는 테이블입니다. 영화인의 속성은 위 이미지를 보면 이름, 출생일, 수상내역 등등이 있고 작품은 필모그래피 테이블에 들어갑니다. 필모그래픽 테이블이 작품 목록이 되는 것입니다.

 

6. 필모그래피 테이블

 

필모 테이블에는 사람마다 그 사람이 어떤 영화에 어떤 역할로 참여했는지 감독, 출연, 스탭 등을 넣습니다. 또한 어떤 영화는 한 사람이 여러번 출현할 수 있습니다. 따라서 역할과 배역까지 pk로 해야합니다.

 

7. 영화사 테이블

영화의 주체는 영화인과 영화사입니다. 영화사 테이블은 영화와 M:N 관계입니다. 한 영화를 만드는데 여러 영화사가 참여하고 한 영화사가 여러 영화에 참여합니다.

 

8. 포토 테이블

포토 테이블은 위에서와 같이 어떤 테이블과 관련이 있는지 보고 그 테이블과 몇 대 몇 관계인지 보면 됩니다. 큰 틀이 되는 테이블을 만들었으면 이 과정을 반복하는 것입니다. 포토 테이블은 영화 테이블과 관련이 있고 내부에 구분(스틸컷/프로모션/포스터)을 가집니다.

 

9. 평점 테이블

각 관객의 평점이 나와있습니다. 그러면 위처럼 관객 테이블에 평점을 넣어야 하는 것이 아닌가 싶습니다. 평점을 넣는 방법은 2가지가 있습니다. 관객, 영화가 메인인 ERD라면 관객에 넣는 것이 맞는데 이 사이트는 네이버 영화 사이트로 영화가 메인이고 영화에 평점이 있게 해야합니다.

 

또한 한 회원은 영화 하나에 한 번만 평점을 줄 수 있어야합니다. 영화 번호와 회원번호를 pk로 두면 한 영화에 한 회원은 한 번만 평점을 매길 수 있게 됩니다. 평점 번호로 pk를 하면 한 회원이 한 영화에 여러번 평점을 매길 수 있기 때문에 평점 테이블인데 평점번호로 pk를 하면 안됩니다.

 

10. 리뷰 테이블

리뷰는 한 사람이 여러번 할 수 있도록 가정합니다. 한 사람이 한 번만 하게 하려면 평점 테이블인데 평점 번호로 하면 안됐습니다. 한 사람이 여러번 하려면 리뷰 번호를 따로 pk로 만들면 됩니다. 이는 기획자의 의도대로 한 번 할 지 여러 번 할지 정하면 됩니다.

 

11. 시리즈 테이블

시리즈는 동아리 구분과 같다고 볼 수 있습니다. 여러 영화가 하나의 시리즈에 속합니다.

 

- 정리

이렇게 DB 설계를 마무리합니다. 메인인 영화 테이블이 있고 영화에 관련된 테이블들이 생깁니다. 가장 중요한 테이블은 영화, 영화인, 영화사로 이 테이블들을 주변으로 세부 테이블들이 생깁니다. 사람 입장에서 보면 전부 다 영화 테이블에 둬야할 것 같은데 엔터티 입장으로 봐서 각 엔터티를 만들고 엔터티의 속성으로 들어가게 됩니다. 각 테이블이 각 엔터티가 가져야하는 속성들을 가지고 있습니다.

 

결론

상당히 복잡합니다. 근데 실제로 네이버 영화에 데이터를 넣으려면 이 정도는 설계해야 데이터가 다 들어갈 수 있습니다.

Comments