게시글 댓글 기능 설계 - ttasjwi/board-system GitHub Wiki
게시글 댓글 정책
- 게시글에는 누구나 댓글을 달 수 있다.
- 그러나 게시글 카테고리 정책상, 일반 사용자가 댓글을 달 수 없게 규칙이 정해져있다면 댓글을 달 수 없다.
- 댓글은 최대 2depth 까지 허용한다.
- 댓글 - 대댓글
- 대댓글에 댓글을 달경우 댓글에 대댓글을 단것처럼 계층화된다. (2depth)
- 대신 대댓글 작성시 누구에게 대댓글을 달았는지 기록이 남는다. (부모댓글 대상 userId, nickname)
- 무한depth 구조와 달리 댓글의 계층을 디테일하게 확인할 순 없지만 누구에게 대댓글을 달았는지 확인할 수 있고 그것만으로도 커뮤니티 운영에 큰 지장이 없다고 판단했다.
- 댓글 작성시, 그 시점의 댓글 작성자 닉네임 및 박제된다.
- 대댓글 작성시, 부모댓글의 id, nickname(댓글 작성시점) 이 박제된다.
- 댓글 작성시 게시글 댓글 수가 1 증가한다.(비정규화)
테이블 설계
CREATE TABLE IF NOT EXISTS article_comments(
article_comment_id BIGINT NOT NULL PRIMARY KEY,
content VARCHAR(3000) NOT NULL,
article_id BIGINT NOT NULL,
root_parent_comment_id BIGINT NOT NULL,
writer_id BIGINT NOT NULL,
writer_nickname VARCHAR(15) NOT NULL,
parent_comment_writer_id BIGINT,
parent_comment_writer_nickname VARCHAR(15),
delete_status VARCHAR(20) NOT NULL,
created_at DATETIME NOT NULL,
modified_at DATETIME NOT NULL
);
- article_comment_id : 식별자
- content : 댓글 내용
- article_id : 게시글 id
- root_parent_comment_id : 부모댓글 id
- 자기 자신이 루트댓글일 경우 이 값은 댓글 자신의 식별자와 같다.
- 대댓글일 경우, 이 값은 부모 루트 댓글의 식별자가 된다.
- writer_id : 댓글 작성자 id
- writer_nickname: 댓글 작성자의 작성시점 닉네임
- parent_comment_writer_id : 대댓글일 경우, 부모댓글의 작성자 id (대댓글이 아니면 null)
- parent_comment_writer_nickname : 대댓글일 경우, 부모댓글기준 작성자 nickname (대댓글이 아니면 null)
- delete_status : 삭제 상태(삭제되지 않음, 작성자에 의해 삭제됨, 관리자에 의해 삭제됨)
- created_at : 생성 시점
- modified_at: 최종 수정 시점
CREATE TABLE IF NOT EXISTS article_comment_counts(
article_id BIGINT NOT NULL PRIMARY KEY,
comment_count BIGINT NOT NULL
);
- article_id : 게시글 id
- comment_count : 댓글 수