상황
프로젝트에서 댓글+대댓글 기능을 구현하려고 했을 때 다음과 같은 구조를 떠올렸다
- comment — 댓글 본문을 저장
- comment_repost — 댓글과 대댓글의 관계를 별도로 저장하는 테이블
대댓글을 위한 관계 테이블이 있어야 한다고 생각을 했다. 하지만 앞으로 기능구현을 해야할때 과연 이 구조가 최선의 선택일까를 고민하다가 댓글 시스템은 자료구조 tree 형태라는 것을 알게 되며 재귀관계라는 개념까지 연결되었다.
재귀 관계 (Self-Reference)
재귀 구조란 하나의 테이블이 스스로를 참조하는 구조
parent_comment_id BIGINT NULL REFERENCES comment(id)
장점
- 댓글/대댓글/대대댓글… 모두 하나의 테이블로 관리
- CRUD 로직 단순함
- join이 명확해짐
- comment.parent_comment_id만 보면 부모 접근 가능
- 구조적 중복 제거
- comment_repost 같은 불필요한 테이블 없음
댓글 기능은 self-reference 형태의 재귀 구조가 훨씬 자연스럽다는 것을 알게되었다. 불필요한 테이블도 사라졌으며 도메인의 본질 즉 댓글은 결국 댓글의 자식 이라는 구조를 이해하니 계층형 댓글 시스템을 표현할 수 있게 되었다.
'SQL > SQL.' 카테고리의 다른 글
| [SQLD] SQL활용 - 파티션 (0) | 2023.03.17 |
|---|---|
| [SQLD] SQL활용- 윈도우 함수 (0) | 2023.03.17 |
| [SQLD] SQL활용 - GROUP 함수 (0) | 2023.03.17 |
| [SQLD] SQL 활용 - 서브쿼리(Subquery) (0) | 2023.03.17 |
| [SQLD] SQL 활용 - 계층형 쿼리 (0) | 2023.03.17 |