Booklink 프로젝트를 진행하는 중 도서에 대한 후기 테이블을 설계해야 했다. 조건은 다음과 같다.
만약 계층적인 구조를 필요로 하는 대댓글 테이블이라면 더 다양한 컬럼이 필요했겠지만 깊이 1의 테이블은 큰 어려움 없이 설계할 수 있었다.
여기서 고민이 되었던 부분은 다음과 같다.
테이블의 형태는 위와 같다.
하지만 해당 테이블 사용 시 답글에는 크게 필요하지 않은 isbn 컬럼이 추가되어야 하고, isbn은 깊이 0의 댓글에만 필수적인 컬럼이다.
두 테이블로 분리 시 확실히 테이블이 깔끔히 정리된다.
하지만 작성자, 내용, 날짜, 좋아요수의 중복이 있으며 댓글에 대한 좋아요 테이블 생성 시 불필요하게 두 테이블을 설계할 가능성이 있다.
나는 불필요한 중복을 피하기 위해 두 방식 중 1번 방식을 선택했다.
parent_id
컬럼을 설계했을 때, 깊이가 0인 댓글의 parent_id
에는 0, 깊이가 1인 댓글의 parent_id
에는 부모댓글을 넣어주는 방식을 채택했다. 하지만 자기 참조 외래키 방식으로 설계하려고 하니, 부모 댓글에 대해 default 0 값을 적용할 수 없었다.
따라서 parent_id
를 그룹의 형태로 설계하여, 부모댓글은 parent_id
에 본인의 id를 저장하도록 설계하였다. 추가로, 삭제 및 수정된 댓글에 대해서 isDeleted
, isModified
등의 컬럼을 추가할 예정이다.
Depth, order 컬럼 등을 추가하여 원활한 정렬을 위한 설계를 진행할 수 있었지만, 추후 커뮤니티 페이지에서의 계층적 대댓글 설계를 위한 여지를 남겨두고, 이번 테이블은 간소하게 설계하고자 한다.