여러 프로젝트를 해봤지만, 매번 Firebase(NoSQL)를 사용한 안드로이드 프로젝트를 하여서 수업시간 외 프로젝트에서 제대로 된 관계형 데이터베이스 모델링은 이번이 처음이었다. 거기다 멘토님들께서 백엔드는 거의 일주일은 보통 모델링 하느라 바쁘다고 하셔서 처음에 좀 겁을 먹었었다ㅠㅠ 그래도 생각보다 빠르게 끝낸 거 같아 다행이다!! 물론 또 뒤집을 수도 있겠지만..ㅎ
이번 프로젝트에서는 위에 말한 8개 기능을 하기로 결정하고 모델링을 시작하였다.
처음에는 크게 User, Product, Cart, Order, Review, Like 중심으로 모델링을 하면 되지 않을까 생각하고 시작하였다. 그래서 나온 모델링이
User - Cart : 1 to 1
Cart - CartList : 1 to M
Product - CartList : 1 to M
User - Order : 1 to M
Order - OrderList : 1 to M
Product - OrderList : 1 to M
Order - RecipientInfo : 1 to 1
User - Like : 1 to M
Product - Like : 1 to M
Category - Product : 1 to M
Product - Character : M to M
Product - ImageUrl : 1 to M
User - Review : 1 to M
Product - Review : 1 to M
여기서 제일 고민됐던 부분이 장바구니 모델을 주문과 같이 넣고, status를 주어 관리 할 것이냐 아니면 따로 분리하냐였다.
멘토님께 이러한 고민을 여쭈어 보고 얻은 답은
Cart와 Order는 요즘 하나의 테이블로 합쳐 status로 상태 관리를 하는 것이 트렌드라고 하셨고, 장바구니 상태일 시 RecipientInfo 컬럼 값에는 null을 넣으면 된다고 하셨다. (우리와 조금 다른 경우이긴 했지만 다른 팀 말을 들어보니 다른 멘토님께서는 null을 넣으면 자원 낭비가 심하다고 하셨다고 하여, 좀 더 공부해봐야 할 듯 하다.)
Review, Like 같이 두 테이블(User, Product) 사이에 있다고 하여 무조건 중간테이블이 되는 것은 아니라고 한다.
Review의 경우 Product와 User 테이블을 사용하는 경우는 많지만, 직접적으로 Product에서 User, User에서 Product로 참조하는 경우는 없을 듯 하여 ManyToManyField를 사용하진 않고, ForeignKey로만 연결시켜 주었다.
Like는 Review와 다르게 Like자체에 다른 필드를 가지지 않고, User가 상품을 좋아요 할 시 연결만 시켜주면 되기에 ManyToManyField를 사용하였다.
멘토님께서 나중에 Like 테이블에 다른 컬럼들이 추가 되거나, Like에서 User, Product를 참조해야하는 경우가 생길 수 있으니, Like에서 ForeignKey로도 각각(USer, Product)연결 시켜주는 것이 좋다고 하셔서 연결시켜 주었다.
다행히 프로젝트 기간동안 몇몇 컬럼을 추가해야 하는 경우 말곤, 전체적으로 수정해야하는 상황은 없었다!! 😄