게시글 댓글 기능 설계 - 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 : 댓글 수