'도우미'프로젝트는 코딩테스트 질문을 남길 수 있고, 퀴즈를 만들어 사람들이 풀게 끔하는 웹사이트이다.
user 테이블이 필요하다.test, quiz 테이블도 필요할 것이다.comment테이블도 필요하다.tag 테이블이 필요하다.tag테이블에는 tag들의 속성, 세부 특성을 저장하는 테이블이기 때문에, 퀴즈 글과 연결할 quiztag테이블도 필요하다.likes테이블이 필요하다.
처음에 내가 짰던 데이터 베이스 구조이다.
여기서 문제점이 여러가지 발생한다.
댓글과 글 기능에 모두 좋아요 기능을 넣기 위해서는 따로 글과 댓글 각각에게 연결 시킬 likes 테이블을이 추가적으로 들어가야한다.
댓글에 연결된 likes 테이블만 있고 갯수를 바로 조회하는 컬럼이 없어서 댓글마다 좋아요 갯수를 전부 counting해줘야한다.
quizimage의 사진 순서 문제이다. 블로그처럼 글을 작성하는 기능을 만들려면 사진의 순서가 필요한데 내가 짠 구조는 어떤 글에 사진이 저장되었는지만 저장하고 있다. 따라서, 어떤 사진이 먼저와야될 지 순서를 알 수 없는 문제가 생긴다.
이러한 문제점이 있기 때문에 해결방법을 생각해보았다.

likes 테이블에 어떤 글이나 어떤 댓글인지 확인하는 type 컬럼을 추가한다.likes 테이블에 counting을 하여 좋아요 갯수를 확인한다.https://congsong.tistory.com/68
같이 프로젝트를 진행하는 팀원 분께서 알려주신 toast api이다.
해당 api를 쓰면 따로 이미지를 저장하는 테이블이 필요 없을 것 같긴한데 일단 어디다 저장할 지 모르니 image테이블은 그대로 두었다.
likes테이블에 고유 값이 여러가지라 외래키를 만들지 못한다.
post테이블로 만들어줬다.tag,quiztag, answer , postimage 테이블 참고comment테이블로 만들어주었다.
최종 결과물은 해결법 2를 선택하였고 조금 수정을 하였다.
사진 이미지는 toast api를 사용하기로 결정해서(file을 다른 서버에 저장해놓고 markdown에서 바로 불러오는 방식) 사진 이미지 테이블은 삭제해주었다.
comment와 post테이블의 like 컬럼을 두지 않고, like 테이블을 하나로 두고 type 컬럼으로 구별할 수 있게 하였다. 또한 post_id, user_id, type의 데이터가 중복되지 않게 UNIQUE로 두었다.
그리고 counting하는 방식을 사용하기로 하였기 때문에 post와 comment에는 like 컬럼을 빼주었다.
comment에는 대댓글도 필요하기 때문에 parent_comment_id 컬럼을 추가하였다.
만약 댓글이면 parent_comment_id가 0이 되고, 대댓글이면 parent_comment_id는 해당 대댓글의 부모 댓글 id가 된다.
id (BIGINT, PRIMARY KEY, AUTO_INCREMENT): 사용자 고유 번호userId VARCHAR(255): 사용자 아이디password VARCHAR(255): 사용자 비밀번호id (BIGINT, PRIMARY KEY, AUTO_INCREMENT): 게시판 고유 번호user_id BIGINT: 사용자 아이디type VARCHAR(255): 퀴즈, 코딩테스트 타입title VARCHAR(250) : 게시판 제목contents VARCHAR(3000) : 게시판 내용created_at DATETIME : 생성 날짜updated_at DATETIME : 수정 날짜id (INT, PRIMARYKEY, AUTO_INCREMENT): 좋아요 고유번호post_id (BIGINT, UNIQUE): 게시판 or 댓글 고유 번호user_id (BIGINT, FOREIGN KEY, UNIQUE): 사용자 아이디type VARCHAR(50): 댓글, 게시판인지 구별하는 타입post_id BIGINT: 게시판 아이디answer VARCHAR(3000): 게시판 정답id (BIGINT, PRIMARY KEY, AUTO_INCREMENT): 댓글 고유 번호user_id BIGINT: 사용자 아이디post_id BIGINT: 게시물 아이디type VARCHAR(255): 퀴즈, 코딩테스트 타입title VARCHAR(250) : 게시판 제목contents VARCHAR(1500) : 게시판 내용created_at DATETIME : 생성 날짜updated_at DATETIME : 수정 날짜like INT(11) : 좋아요 수display TINYINT(4) : 공개, 비공개(display=0이라면 공개, display=1이면 비공개이다.)parent_comment_id: BIGINT : 부모 댓글 아이디 (대댓글일때 존재, 댓글일 경우 0)id BIGINT: 태그 고유번호type VARCHAR(50): 과목 이름title VARCHAR(50) : 세부 과목 이름post_id BIGINT: 게시물 아이디tag_id BIGINT: 태그 아이디