쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

현재 프로젝트 코칭 기간인데 다들 데이터 모델링하는 부분을 어려워 해서 강사님께서 쇼핑몰에 들어갈 데이터들을 데이터 모델링 하는 것을 예제로 강의 해주셨다.

1. 쇼핑몰 데이터베이스에 필요한 사항들을 정리

  • 회원이 상품을 구매한다
  • 회원이 상품을 카트에 담을 수 있다
  • 회원정보 : 회원아이디, 비밀번호, 성명, 주소, 연락처
  • 상품 : 상품아이디, 상품명, 이미지, 가격
  • 회원이 요구하는 배송지에 배송을 한다
  • 회원을 0 또는 1곳 이상의 배송지를 등록할 수 있다
  • 배송지 : 배송지 아이디, 회원 아이디, 우편번호, 연락처, 주소, 기본여부
  • 회원이 구매할때 카트에 상품을 담는다
  • 카트 : 회원아이디, 상품아이디, 수량, 금액, 날짜
  • 회원은 구매시 신용카드로 구매한다
  • 신용카드 : 신용카드 아이디, 회원 아이디, 카드사, 카드번호, 유효기간
  • 회원은 0 혹은 1장이상의 신용카드를 등록한다
  • 주문 : 회원 아이디, 주문 일자, 상품명, 수량, 금액, 배송지 아이디, 카드아이디

2.위 내용을 요구사항과 엔티티로 구분한다.

요구 사항

  • 회원이 상품을 구매한다
  • 회원이 상품을 카트에 담을 수 있다
  • 회원은 구매시 신용카드로 구매한다
  • 회원은 0 혹은 1장이상의 신용카드를 등록한다
  • 회원이 요구하는 배송지에 배송을 한다
  • 회원을 0 또는 1곳 이상의 배송지를 등록할 수 있다

엔티티

  • 회원정보 : 회원아이디, 비밀번호, 성명, 주소, 연락처
  • 상품 : 상품아이디, 상품명, 이미지, 가격
  • 배송지 : 배송지 아이디, 회원 아이디, 우편번호, 연락처, 주소, 기본여부
  • 카트 : 회원아이디, 상품아이디, 수량, 금액, 날짜
  • 신용카드 : 신용카드 아이디, 회원 아이디, 카드사, 카드번호, 유효기간
  • 주문 : 회원 아이디, 주문 일자, 상품명, 수량, 금액, 배송지 아이디, 카드아이디

3. ERD 만들기

ERD 툴은 ERDcloud를 이용했다.

요구사항 분석을 참고하여 엔티티들을 테이블로 만들고 1:1, 1:n, n:m으로 관계를 생성해준다.
관계를 생성할 때 한쪽 테이블의 외래키가 다른쪽 테이블의 기본키가 되는경우 식별관계, 일반 칼럼이 되는경우 비 식별관계로 설정한다.

장바구니 - 상품의 경우 n:m의 관계이기 때문에 장바구니_상품이라는 관계테이블을 생성하였는데

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

이렇게 만들경우 백엔드로 구현할때 조인이 많아져 쿼리문이 복잡해져서 구현이 힘들어지므로 장바구니_상품 테이블에 장바구니의 칼럼들을 추가해주고(역정규화) 장바구니 테이블을 삭제 해준다

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

그럼 위와 같이 ERD가 완성된다.

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

간단한 쇼핑몰 모델링으로 보는  ER 구조 파악

1. 구성

개념적으로는 회원 - 상품(M:M)  구조이지만 실제 개발에서는 구매 테이블을 넣고 회원 - 구매 - 상품 (1:M, M:1) 관계로 테이블이 생성된다

2. 점선과 실선

관계선 표기법의 종류중 Richard Barker 관계선 방식이다

Mandatory(필수/실선) 와 Optional(선택/점선) 관계로 확인할 수있으며

회원 - 구매 (1:M) 관계를 예시로 보자면 

   (1) 회원은 구매내역이 필수가 아니다 (Optional)

   (2) 구매내역에는 회원정보가 필수이다 (Mandatory)

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

Information Engineering 방식은 아래의 그림처럼 표현 된다

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling
Information Engineering 방식

3. 쿼리에서의 사용

필수 는 inner join  선택은 left join 관계로 표현하면 된다

회원의 구매내역은 구매내역을 left join 으로

구매내역 목록은 회원을 inner join 으로 표현하라는 관계도로 파악하면 된다

4. 양쪽이 선택(Optional)인 경우

   (1) 이벤트만 생성해놓고 상품은 추가되지 않는 경우 (Optional)

   (2) 상품에 이벤트가 적용되지 않는 경우 (Optional)

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling

5. 식별 비식별 관계

식별 관계는 각각의 관계 테이블의 FK를 PK로 지정하는 경우이고

비식별 관계는 FK로 지정해 조인을 하는 방식이다

식별관계에서는 FK의 변경에 따른 PK 업데이트가 번거로워질 수 있고,

비식별 관계에서는 기본적으로 데이터를 특정하기 위해선 join을 여러번 사용해야한다는 단점이있다

6. 정규화 처리

1:M 으로 한테이블 안에서 중복이 발생할 경우에는 테이블을 나눠야한다

쇼핑몰 데이터베이스 모델링 - syopingmol deiteobeiseu modelling
구매내역에서 사용할 쿠폰이 여러개이기 때문에 테이블이 나뉨

ERD를 그려서 의존관계를 표현하면서 설계하기가 쉽지 않았다

쇼핑몰을 참고해서 이것저것 테이블을 만들다가 너무 복잡해져버렸다;;

그래서 일단 고객, 주문, 상세 위주로 간단하게 작성하고 필요한 부분은 구현하면서 채워 넣기로....

첫번째로 고객 테이블은 고객들의 고유 코드번호, 비회원이 아닐경우 아이디, 비밀번호, 이름, 이메일주소 까지만 간단히 만들었고

두번째로 주문 테이블은 주문 아이디, 고객 고유 코드번호는 고객테이블을 참조하는 외래키로 설정 하였고, 주문 날짜, 총 가격, 주문 상태를 만들었다.

세번째로 상품 테이블은 상품 아이디, 상품 이름, 상품 이미지, 상품 상태, 상품가격 등 상품정보를 담는 테이블을 만들었다.

그리고 주문 상세 테이블을 만들어 각 주문 아이디에 해당하는 상품과 상품 갯수와 상품가격을 표시하는 테이블 따로 설계하였다.