MSA-1. ERD 설계 및 작성
새로운 프로젝트에 대한 명세는 아래와 같다.
- 기본적인 E-commerce 서비스를 위한 회원 플랫폼
- 사용자는 플랫폼을 통해 회원가입, 로그인, 로그아웃, 마이페이지 등의 기본적인 유저 관리 기능을 편리하게 이용
- 커머스를 이용하기 위한 핵심 요소인 WishList, 주문내역, 주문상태 조회 등의 기능을 제공하여 사용자가 원하는 물품의 구매 및 진행 상태를 원할하게 인지
- 올바른 주문 및 결제/환불 등을 처리하기 위해선 회원의 개인정보가 저장되어야 함
위와 같은 명세를 충족하기 위해 아래와 같이 ERD를 설계했다.
주요 entity
- Users (사용자)
- email (PK, 이메일)
- user_name (사용자 이름)
- password (비밀번호)
- phone (전화번호)
- address (주소)
- Orders (주문)
- orderKey (PK, 주문 키)
- email (FK, 이메일)
- orderStatus (주문 상태)
- orderAt (주문 날짜)
- OrderDetail (주문 상세)
- orderDetailKey (PK, 주문 상세 키)
- orderKey (FK, 주문 키)
- productID (FK, 제품 ID)
- orderPrice (주문 가격)
- productCount (제품 수량)
- Products (제품)
- productID (PK, 제품 ID)
- productName (제품 이름)
- price (가격)
- stock (재고)
- WishList (위시리스트)
- wishID (PK, 위시리스트 ID)
- email (FK, 이메일)
- productID (FK, 제품 ID)
- addAt (추가 날짜)
관계
- Users < Orders
- 한 명의 사용자가 여러 개의 주문을 할 수 있음
- Users < WishList
- 한 명의 사용자가 여러 개의 위시리스트 항목을 가질 수 있음
- Orders < OrderDetail
- 하나의 주문이 여러 개의 주문 상세를 가질 수 있음
- Products < OrderDetail
- 하나의 제품이 여러 개의 주문 상세에 포함될 수 있음
- Products < WishList
- 하나의 제품이 여러 사용자의 위시리스트에 포함될 수 있음
n+1 문제에 대한 해결방안 모색
- n+1 문제가 뭔지 정확히 이해하기
- 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다.
해결 방법
- Eager Loading (즉시 로딩)
- N+1 문제를 해결하는 일반적인 방법은 즉시 로딩을 사용하는 것이다. 즉시 로딩을 사용하면, 관련된 데이터를 한 번의 조인 쿼리로 가져올 수 있다.
- Batch Loading (배치 로딩)
- ORM 도구에 따라 배치 로딩이라는 기법도 사용될 수 있다. 배치 로딩은 필요한 데이터를 여러 번의 적은 수의 쿼리로 나누어 가져오는 방법 중 하나다.
내가 설계한 ERD는 N+1 문제가 발생할 여지가 없어 보여서 우선 이렇게 설계를 했다. ERD를 제대로 설계해야 모든 데이터의 흐름을 내가 컨트롤 할 수 있기 때문에 ERD 설계는 정말 중요한 부분 중 하나이다.
Comments