기능명세서와 화면 와이어프레임이 작성되고 나니 ERD에 들어갈 내용도 어느정도 나오게 되어 작성을 시작했다.
큰 주제 자체는 쇼핑몰이라서 다른 쇼핑몰 사이트와 크게 다를 부분은 없을 것 같다.
우리 사이트의 주제가 구독이라서 구매 대신 구독 테이블이 존재한다는 점만 다르다.
전체적인 ERD는 아래와 같고 세부적인 내용은 따로 작성했다.
회원가입을 진행할 때 고객에게 받아야할 정보 위주로 테이블 필드를 구성했다.
고객 비밀번호는 암호화하여 저장하기 위해 컬럼 길이를 넉넉히 varchar2(100)으로 설정했다.
고객상태의 경우는 회원가입시에 무조건 true이지만 고객이 탈퇴할 경우 실제 데이터베이스에서 해당 회원정보를 지우는게 아니라 고객상태를 false로 바꿔 정보를 유지할 수 있게 설계했다.
고객등급은 원래 관리자와 고객 테이블을 별도로 설계하려고 했으나 다른 테이블간의 관계 설정때문에 나누지 않았다.
대신 회원가입한 고객은 무조건 2 라는 값을 부여해 일반 고객임을 명시했고, 관리자는 따로 가입하는 페이지를 만들지 않고 일반 고객처럼 가입하여 수기로 데이터 베이스에서 1로 수정하는 방식으로 설계했다.
주소 테이블의 경우 별도로 만들게 되었는데 사용자에게 최대 5개 저장할 수 있게 설계했다.
해당 주소를 기본 주소지로 쓸지에 대한 여부와 관련된 컬럼을 추가로 설계했다.
위시리스트 테이블의 경우는 간단하게 고객의 정보와 조인하기 위해 고객 시퀀스, 상품의 정보와 조인하기 위해 상품 시퀀스만 가지고 있게 설계했다.
우리가 개발하는 가전구독 서비스 자체에서는 크게 9가지 카테고리로 나뉘게 되는데 그거에 대한 정보를 담은 테이블을 간단히 설계했다.
이 상품 테이블을 설계하는데 상당히 어려웠다.
처음에는 상품과 상품상세에 대한 테이블을 각각 설계해서 조인하는 방법으로 가려고 했으나 상품상세 테이블에 기본키가 없어서 정규화에 위배되는 테이블이 생성됐었다.
이거를 나중에 알게 되어 실제 DB를 만든 이후에 ERD를 수정했다.
상품 테이블에는 우리 사이트에서 보여줄 상품에 대한 정보를 어느정도까지 보여줄지에 대해 정한 뒤에 컬럼을 지정했다.
상품이미지와 상품상세이미지는 각각 1개씩으로 파일명만 DB에 저장해두었다.
FAQ 테이블은 다른 테이블과 관계가 전혀 없어서 ERD에는 살짝 동떨어져있다.
컬럼은 필요한 질문과 답변에 대한 컬럼만 있다.
리뷰 테이블도 상품 테이블처럼 개발하던 중간에 설계를 한 번 바꾼적이 있어 상당히 어려움을 겪었었다.
기존에 리뷰 테이블은 구독과 상관없이 고객, 상품 테이블과 조인하기 위해서 고객시퀀스, 상품시퀀스를 외래키로 받아왔었는데 그러면 리뷰를 남기기가 애매해진다.
왜냐면 우리 사이트상 특정 개월수 이상 구독을 하게 되면 상품을 업그레이드 할 수 있게 되는데 리뷰 테이블에 상품시퀀스를 넣게 되면 A상품에 대한 리뷰가 업그레이드 후 B상품에 대한 리뷰로 바뀌기 때문이다.
그래서 리뷰테이블에는 구독시퀀스를 받아오게 설정하였고 그 외에 컬럼은 리뷰 작성시 필요한 컬럼만 추가하였다.
장바구니 테이블은 고객과 상품에 대한 정보가 필요해 고객시퀀스, 상품시퀀스를 외래키로 받아오게 했다.
고객이 장바구니에 담을 때 무조건 해당 상품에 대한 계약기간을 담게 설계했다.
사실상 구독 테이블이 결제 테이블을 합친 개념으로 만들었다.
한 고객은 1번의 결제로 1번의 구독이 가능하고 그 1번의 구독은 1개의 상품에 대해서만 가능하게 설계했다.
그래서 고객에 대한 정보를 담은 고객시퀀스, 상품에 대한 정보를 담은 상품 시퀀스를 외래키로 받아오게 했다.
배송받는 정보에 대한 컬럼들과 해당 구독 상품이 업그레이드 되었는지, 구독 상품을 해제했는지에 대한 컬럼을 추가했다.
결제날짜의 경우는 추후에 상품을 업그레이드 했을때 주문한 날짜와 다르게 데이터를 넣기 위해 별도로 추가했다.