erDiagram
Page {
id BIGINT PK "NOT NULL, AUTO_INCREMENT"
title VARCHAR(255) "DEFAULT '제목없음'"
content TEXT
top_page_id BIGINT "NOT NULL"
parent_page_id BIGINT "NULL"
}
- id : 고유 식별자
- title : 제목
- content : 내용
- top_page_id : 최상위 노드의 고유 식별자
- parent_page_id : 상위 노드의 고유 식별자
🤔 접근 방식
- 작성된 페이지들의 depth가 깊어질 수록 Join이 많아져 조회 성능이 비효율적이다.
- Join을 쓰지 않고 조회하기 위하여 그래프 구조를 생각해보았다.
- 최상위 페이지의 정보와 부모 페이지의 정보를 가지고 있다면 그래프 탐색이 가능하다.
1페이지안에2페이지와3페이지가 있다.2페이지안에4페이지와5페이지가 있다.4페이지안에6페이지가 있다.3페이지안에7페이지와8페이지와9페이지가 있다.8페이지안에10페이지와11페이지가 있다.
- 최상위 노드 : top_page_id
- 상위 노드 : parent_page_id
pageId: 1 을 생성할 때 최상위 노드를 1 로 상위 노드를 null 로 추가한다.
pageId: 2 를 생성할 때 최상위 노드를 1 로 상위 노드를 1 로 추가한다.
pageId: 3 를 생성할 때 최상위 노드를 1 로 상위 노드를 1 로 추가한다.
pageId: 4 를 생성할 때 최상위 노드를 1 로 상위 노드를 2 로 추가한다.
pageId: 5 를 생성할 때 최상위 노드를 1 로 상위 노드를 2 로 추가한다.
pageId: 6 을 생성할 때 최상위 노드를 1 로 상위 노드를 4 로 추가한다.
pageId: 7 를 생성할 때 최상위 노드를 1 로 상위 노드를 3 로 추가한다.
pageId: 8 를 생성할 때 최상위 노드를 1 로 상위 노드를 3 로 추가한다.
pageId: 9 을 생성할 때 최상위 노드를 1 로 상위 노드를 3 로 추가한다.
pageId: 10 를 생성할 때 최상위 노드를 1 로 상위 노드를 8 로 추가한다.
pageId: 11 를 생성할 때 최상위 노드를 1 로 상위 노드를 8 로 추가한다.
insert 로직을 수행한다면 아래와 같이 데이터를 그래프화 할 수 있다.
flowchart TB
id1((pageId : 1))
id2((pageId : 2))
id3((pageId : 3))
id4((pageId : 4))
id5((pageId : 5))
id6((pageId : 6))
id7((pageId : 7))
id8((pageId : 8))
id9((pageId : 9))
id10((pageId : 10))
id11((pageId : 11))
id1 --- id2
id1 --- id3
id2 --- id4
id2 --- id5
id4 --- id6
id3 --- id7
id3 --- id8
id3 --- id9
id8 --- id10
id8 --- id11
- 만약
pageId : 4페이지를 조회한다면
pageId : 1,pageId : 2,pageId : 4가Breadcrumbs정보가 되고
pageId : 6이서브 페이지 리스트정보가 된다. - 만약
pageId : 3페이지를 조회한다면
pageId : 1,pageId : 3이Breadcrumbs정보가 되고
pageId : 7,pageId : 8,pageId : 9가서브 페이지 리스트정보가 된다.
pageId : 8에 있는top_page_id(최상위 노드)인pageId : 1을 기준으로top_page_id인 데이터를 조회하여pageId : 1,pageId : 2...pageId : 11까지 데이터를 취득한다.pageId : 8을 시작으로top_page_id까지재귀 함수를 통해 최단 방향을 찾는다.pageId : 8의 부모 페이지인pageId : 3을 찾고Breadcrumbs에 추가한다.pageId : 3의 부모 페이지인pageId : 1을 찾고Breadcrumbs에 추가한다.pageId : 1의 부모 페이지가 없으므로재귀 함수를 종료한다.- 취득한 데이터에서
pageId : 8가parent_page_id인 데이터를 조회하여서브 페이지 리스트에 추가한다. Breadcrumbs의 값은 [pageId : 1,pageId : 3,pageId : 8]서브 페이지 리스트의 값은 [pageId : 10,pageId : 11]
{
"pageId": 8,
"title": "Linked List란 무엇인가요?",
"cotent": "연결 리스트(Linked List)는 배열과 비교했을 때, 삽입/삭제 연산에 효율적인 자료구조입니다.",
"subPages": [
10,
11
],
"breadcrumbs": [
1,
3,
8
]
}