-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Category Table
: 검색, 게시글 분류, 피드 노출 등 기능 구현에 있어서 게시글들이 속하는 카테고리가 어떻게 설계 되어야 편리할지 전체 database scheme를 설계하며 중요성 있게 생각해보았다.
우선, 우리 프로젝트에서 요구되는 조건은 다음과 같다.
- 대, 중, 소(아직 미정)의 카테고리 내 세부 카테고리가 존재하는 구조이다.
- 특정 카테고리를 선택하였을 때, 해당 카테고리가 포함하는 서브 카테고리 게시글들이 모두 검색될 수 있어야 한다.
- 카테고리의 수정/삭제의 빈도는 적을 것으로 예상된다. (30개 내외의 노드)
이 조건들을 만족하는 자료구조들을 찾아보던 중 "Nested Set Model"이라는 카테고리 분류법을 찾았다.
RDBMS에서 자주 쓰이는 기존 카테고리 분류 방식은 "Adjacency List Model"이다. 이는 단순히 category_id, parent_id, category_name으로 이루어진 테이블 내에 parent_id 내에 category_id가 종속되어 있는 구조로 다음 쿼리문과 같이 구성된다.
CREATE TABLE 'category ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'parent_id' int(11) DEFAULT NULL, 'category_name' varchar(255) DEFAULT NULL, PRIMARY KEY ('id') ...
이 방식의 문제점은 하나의 SQL구문으로 트리화 및 검색을 할 수 없다는 것이다. 이 테이블을 이용한다면 client측 사이드 코드에서 트리화를 하며 해당 카테고리들의 id를 저장해야하는데 이는 최소 두 번의 SQL 구문이 사용되야 하므로 비효율적이라고 볼 수 있다.
이 문제점에 대한 해결책이 Nested set model이다! 이 방식은 위 태이블의 각 노드(카테고리) 마다 left, right index를 붙여줌으로서 구현된다.

이 모델을 사용한다면 기능 구현에 필요한 SQL 쿼리가 기존 adjacency list 모델보다 저렴해지며, 테이블 데이터 업데이트 측면에서도 더 빠른 속도를 보일 수 있다고 한다. 단, 트리를 수정하는 것이 조금 복잡하기 때문에 트리의 수정이 빈번하지 않은 자료에 대해 적합한 모델이다. 이는 우리가 구현하려고 하는 카테고리의 성질과 부합하기에 이 모델을 채택하기로 하였다!

CREATE TABLE 'category' ( 'category_id' int(11) NOT NULL, 'parent_id' int(11) NULL, 'name' varchar(255) NOT NULL, 'left' int(11) NULL, 'right' int(11) NULL );
참조: https://drib.tech/programming/hierarchical-data-in-relational-databases