[사용자 관련]
- 사용자는 회원가입 시 email, pw, 가입이유를 작성해야 한다.
- 닉네임을 랜덤 지정된다.
- 회원가입 시 가입 일시가 저장된다.
- 로그인 시 토큰을 통해 인증 절차를 거친다.
- 사용자는 폐급 / 특급 둘 중 하나의 계급을 갖는다.
- 사용자의 프로필 사진은 등급에 따라 해당 등급 갤러리의 최다 좋아요 사진으로 자동 설정된다.
[계약서 관련]
- 사용자는 중복해서 계약할 수 없다. 계약기간이 종료되어야만 새로운 계약을 할 수 있다.
- 계약 기간은 1주 / 2주 / 4주 3가지 중 선택한다.
- 한 번의 계약 시 최대 3개의 카테고리를 선택할 수 있다.
- 카테고리는 총 5개이다.
- 계약 시 사용자는 보증용 폐급 사진을 업로드해야 한다.
- 사용자는 계약 이름을 지정할 수 있다.
- 계약 기간동안 사용자는 달성한 일과를 카테고리별로 표시할 수 있다.
- 사용자는 계약 기간동안 카테고리 별로 달성 현황을 볼 수 있다.
- 계약 기간이 끝나면 해당 계약에 대한 카테고리별 달성율 그래프를 볼 수 있다.
- 계약기간 종료 후 계약 실패 시 보증용 사진이 메인페이지 사진 후보에 올라간다.
- 계약 성공 시 사용자는 금갤러리에 올라갈 사진을 제출해야 한다. 그 사진은 사용자의 금갤러리에 올라간다.
위의 요구사항을 참고하여 아래와 같이 DB를 설계했었다.
이 과정에서 Contract 테이블에 카테고리1, 2, 3 컬럼을 세 개 만들어도 되는것인지, 계약 진행상황에 대한 테이블은 어떻게 만들지 막막했다.
사용자가 달성 도장을 찍을 때마다 DB에 카테고리와 날짜를 입력할 지,
카테고리 별 행에 날짜 데이터를 배열로 입력할 지 고민했다.
또한 전체 유저의 실시간 랭킹을 보여주려고하는데, 이 기능을 구현하기 위해 구글의 Firebase를 사용해야 하는지와 같은 고민이 있었다.
이 DB를 가지고 현직 DBA에게 물어보았다.
생각보다(;;) 고쳐야할 점이 많았고, 실무에서 어떻게 하는지 들을 수 있었다. 다음은 그 내용을 정리한 것이다.
'계약' = CT
, '번호' = NO
, '일자' = DT
이런 식으로 단어마다 3~4글자씩 영어 약어를 정해놓는다.그 밖에도 SQLD 시험지에서나 보았던 PK 여러개 만들기 ... 매우 당연하게 쓰는 것이었다. FK를 실제로 구현하지 않다보니 그렇게 하는 것 같다.