ERD 설계하기
1. vs code에서 ERD Editor을 깔아서 실행할 예정이다
2. {db이름}.vuerd.json 파일만든다 -> 이렇게 생성됨
3. (?는 단축키를 알려준다)
4. 빈 캔버스에 우클릭하면 이렇게 나온다
5. Alt + N, Alt + Enter누르면
이렇게 나오는것을 볼 수 있고
pk설정은 우클릭이나 Alt + k 누르면 설정할 수 있다
실습 -----------------------------------------------
요구사항
- 사용자 요구사항
- 카카오 소셜 로그인 구현
- 회원 탈퇴 기능 필요
- 이름, 닉네임, 전화번호 , 성별 필요
- 책관련 요구사항
- 사용자가 책을 여러권 대여 가능
- 책은 하나의 카테고리가 있음
- 책은 제목, 설명에 대한 정보 필요
- 책 소개 페이지에 해시태크가 붙을 수 있고 책 한권에 해시태그가 여러개, 해시태그 하나가 여러 책에 붙을 수 있다
- 사용자가 책 설명 페이지에서 책에 좋아요를 누를 수 있음
- 책 카테고리 별로 현재 몇 개의 책이 있는지 집계 필요
- 알림 관련 요구사항
- 알림은 공지관련 알림, 책 반납 시간 임박 알림, 마케팅 알림
🔥간단히 구현부터
1.
- 테이블 이름, 칼럼 이름 = 소문자, 단어구분은 대소문자가 아니라 _ 로 구분
- 기본키를 위해 각 엔티티 정보중 유일한 값을 기본키로 설정하기보다는 index를 따로 두는것이 편하다 , 그리고 각 index를 위한 id를 book_id가 아니라 id로 둔다
- 기본 키 타입은 int가 아닌 서비스 확장을 고려해 bigint로 한다
따라서 이렇게 구현할 수 있다
2.
타입을 설계 한다 → 피엠에게 물어봐야함 ( 일단 물어봤다고 가정하고 설계한다)
text는 string처럼 길이 제한이 없는 타입 ( 글자 수 제한 줘도 됨)
3.
created_at, updated_at을 테이블마다 추가해준다(datetime(6) = 밀리초 소수점 6자리까지)
- 밀리초까지 구분하는 이유
- 나중에 기능 구현을 염두한 설계임 (최신순 정렬)
- 초 단위 까지 저장하면 created_at이 초 단위까지 같은 상황이 일어나서 최신순 정렬이 되지 않기 때문에 밀리초 소수점까지 구분한다(MySQL기준 6자리가 최대)
4. member 테이블에 status, inactive_date를 두는 것이 좋음
💡왜 저렇게 할까?
- 기능 구현 시 회원탈퇴, 게시글 삭제등 HTTP 메서드 중 delete로 바로 삭제해버리는 방법도 있다 (Hard Delete)
→ 지양함
-일반 비활성 상태로 두고 , 일정기간동안 비활성인 경우 자동 삭제되도록 설계
※ status를 active, inactive 등 enum으로 관리하기 위해 varchar(15)로 둔다 , 얼마동안 비활성화인지 알기위해 inactive_date를 둔다
🤔어떻게 자동으로 지울까?
batch = 정해진 시간에 자동으로 실행되는 프로세스 (예 : 매일 새벽2시에 member테이블을 검사해 inactive된 이후 7일이 지난 경우 삭제하도록 한다) → soft delete라고 함
soft delete는 당연히 HTTP Method중 patch이다
🤔 연관관계에 대한 고민
MySQL은 RDB 기반이고 RDB에서는 외래키로 연관관계를 표시한다
사용자가 책을 대여할때 연관관계는 어떻게 해야할까?
N:M관계일때는 가운데에 매핑 테이블을 따로 두어야한다
가운데 매핑테이블은 양쪽의 기본키를 외래 키로 가지고 각각 1:N관계를 가진다
🤔책과 책 카테고리는 어떻게 매핑할까
- 카테고리 하나 당 여러 종류의 책의 관계 → 1 : N
- 책 한 종류에 여러 카테고리 → N : M관계이므로 가운데에 매핑 테이블 둬야한다
- 해시태그 : 여러개가 한책에 책에 여러 해시태그
- 좋아요 : 사용자 여러명이 좋아요, 한 사용자가 여러 책에 좋아요
🤔알림은 어떻게 설계할까?
- 공지사항에 대한 알림은 알림 터치 시 해당 공지 사항으로 이동이 되고,
마케팅 알림의 경우 터치시 해당 마케팅으로 이동한다
1. 슈퍼 타입과 서브타입의 구성
2. 하나의 테이블에 두고 dtype으로 구분
3. 그냥 테이블 다 나누기