Home > Backend Development > πŸ“š[Backend Development] λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 'Path Enumeration(경둜 μ—΄κ±°) 방식'μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ“š[Backend Development] λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 'Path Enumeration(경둜 μ—΄κ±°) 방식'μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Backend Ddevelopment

β€œπŸ“š[Backend Development] λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 β€˜Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹β€™μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?”

βœ… λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 β€œPath Enumeration(경둜 μ—΄κ±°) 방식” μ„€λͺ….

  • Path Enumeration(경둜 μ—΄κ±°) 방식은 트리 ꡬ쑰의 계측을 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ μ €μž₯ν•˜μ—¬ μ •λ ¬ 및 검색을 효율적으둜 μˆ˜ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
  • 이 방식은 트리의 λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μœ μ§€ν•˜λ©΄μ„œ λΉ λ₯΄κ²Œ μ •λ ¬ 및 μ‘°νšŒν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

πŸ—οΈ1️⃣ Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹μ΄λž€?

  • Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹μ—μ„œλŠ” 각 λŒ“κΈ€μ˜ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό λ¬Έμžμ—΄ 경둜(path)둜 μ €μž₯ν•©λ‹ˆλ‹€.
  • 즉, 각 λŒ“κΈ€μ΄ 트리 κ΅¬μ‘°μ—μ„œ μ–΄λ–€ μœ„μΉ˜μ— μžˆλŠ”μ§€ 경둜λ₯Ό 미리 κΈ°λ‘ν•˜μ—¬ μ •λ ¬ 및 검색을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.

πŸ—οΈ2️⃣ ν…Œμ΄λΈ” ꡬ쑰.

  • Path Enumeration(경둜 μ—΄κ±°) 방식을 μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 좔가적인 path 컬럼이 ν•„μš”ν•©λ‹ˆλ‹€.
ν•„λ“œλͺ… μ„€λͺ…
comment_id λŒ“κΈ€μ˜ 고유 ID (PK)
parent_comment_id λΆ€λͺ¨ λŒ“κΈ€μ˜ ID (μ΅œμƒμœ„ λŒ“κΈ€μ΄λ©΄ NULL)
article_id ν•΄λ‹Ή λŒ“κΈ€μ΄ μ†ν•œ κ²Œμ‹œκΈ€ ID
content λŒ“κΈ€ λ‚΄μš©
created_at λŒ“κΈ€ μž‘μ„± μ‹œκ°„
path λŒ“κΈ€μ˜ 계측 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ (예: β€œ00001.00002.00005”
  • πŸ“Œ path ν•„λ“œλŠ” 각 λŒ“κΈ€μ΄ 트리 κ΅¬μ‘°μ—μ„œ 어디에 μ†ν•˜λŠ”μ§€ λ‚˜νƒ€λƒ„
  • πŸ“Œ 이 값을 ν™œμš©ν•˜λ©΄ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μ •λ ¬ 및 μ‘°νšŒν•˜λŠ” 것이 μ‰¬μ›Œμ§

πŸ—οΈ3️⃣ Path κ°’ μ €μž₯ 방식.

  • path 값은 λŒ“κΈ€μ΄ νŠΈλ¦¬μ—μ„œ μ–΄λ–€ μœ„μΉ˜μ— μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 각 comment_idλ₯Ό 5자리 λ¬Έμžμ—΄(00001, 00002 λ“±)둜 λ³€ν™˜ν•˜μ—¬ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

πŸ“Œ Path κ°’ μ˜ˆμ‹œ

comment_id parent_comment_id path
1 NULL 00001
2 1 00001.00002
3 NULL 00003
4 2 00001.00002.00004
5 4 00001.00002.00004.00005
6 NULL 00006
  • πŸ“Œ 각 λŒ“κΈ€μ€ λΆ€λͺ¨ pathλ₯Ό 상속받고, μžμ‹ μ˜ IDλ₯Ό μΆ”κ°€ν•˜μ—¬ pathλ₯Ό 생성
  • πŸ“Œ λΆ€λͺ¨ λŒ“κΈ€μ΄ μ‚­μ œλ˜λ”λΌλ„ pathλ₯Ό 톡해 계측 ꡬ쑰λ₯Ό μ‰½κ²Œ μœ μ§€ κ°€λŠ₯

πŸ—οΈ4️⃣ Path Enumeration(경둜 μ—΄κ±°)을 ν™œμš©ν•œ μ •λ ¬.

  • Path Enumeration(경둜 μ—΄κ±°)을 ν™œμš©ν•˜λ©΄ 경둜 μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•˜λ©΄ λŒ“κΈ€μ„ 계측 ꡬ쑰 κ·ΈλŒ€λ‘œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
SELECT * FROM comment
WHERE article_id = ?
ORDER BY path ASC;
  • πŸ“Œ ORDER BY path ASCλ₯Ό μ μš©ν•˜λ©΄ 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ 정렬됨
  • πŸ“Œ 일반적인 ORDER BY parent_comment_id, comment_id보닀 트리 ꡬ쑰 정렬이 정확함

πŸ—οΈ5️⃣ Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹μœΌλ‘œ 쑰회

πŸ“Œ 예제 데이터

comment_id parent_comment_id path
1 NULL 00001
2 1 00001.00002
3 NULL 00003
4 2 00001.00002.00004
5 4 000001.00002.00004.00005
6 NULL 00006

πŸ“Œ μ •λ ¬λœ κ²°κ³Ό.

SELECT * FROM comment
WHERE article_id = ?
ORDER BY path ASC;

βœ… 좜λ ₯ κ²°κ³Ό

1. λŒ“κΈ€1
    β”œβ”€β”€ λŒ“κΈ€2
        β”œβ”€β”€ λŒ“κΈ€4
            β”œβ”€β”€ λŒ“κΈ€5
2. λŒ“κΈ€3
3. λŒ“κΈ€6
  • πŸ“Œ 계측 ꡬ쑰가 μ •ν™•ν•˜κ²Œ μœ μ§€λ˜λ©΄μ„œ 정렬됨.

πŸ—οΈ6️⃣ νŠΉμ • λŒ“κΈ€μ˜ ν•˜μœ„ λŒ“κΈ€ 쑰회.

  • Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹μ—μ„œλŠ” νŠΉμ • λŒ“κΈ€μ˜ λͺ¨λ“  ν•˜μœ„ λŒ“κΈ€μ„ μ†μ‰½κ²Œ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
SELECT * FROM comment
WHERE path LIKE '00001.00002%'
ORDER BY path ASC;
  • πŸ“Œ κ²°κ³Ό: 00001.00002둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  ν•˜μœ„ λŒ“κΈ€μ„ 쑰회 (λŒ“κΈ€2, λŒ“κΈ€4, λŒ“κΈ€5 포함)

πŸ—οΈ7️⃣ Path Enumeration λ°©μ‹μ˜ μž₯점과 단점.

βœ… μž₯점.

μž₯점 μ„€λͺ…
트리 ꡬ쑰 μœ μ§€κ°€ 쉬움 ORDER BY path ASC만으둜 계측 ꡬ쑰 μ •λ ¬ κ°€λŠ₯
ν•˜μœ„ λŒ“κΈ€ μ‘°νšŒκ°€ 빠름 LIKE β€˜κ²½λ‘œ%β€™λ‘œ μ†μ‰½κ²Œ ν•˜μœ„ λŒ“κΈ€ 쑰회 κ°€λŠ₯
λΆ€λͺ¨ λŒ“κΈ€ μ‚­μ œ μ‹œ 계측 ꡬ쑰 μœ μ§€ κ°€λŠ₯ pathλ₯Ό 톡해 μƒμœ„ λŒ“κΈ€μ„ 식별 κ°€λŠ₯

❌ 단점.

단점 μ„€λͺ…
λŒ“κΈ€ 이동 μ‹œ path μ—…λ°μ΄νŠΈ ν•„μš” λŒ“κΈ€μ„ λ‹€λ₯Έ λΆ€λͺ¨λ‘œ μ΄λ™ν•˜λ©΄ pathλ₯Ό λ³€κ²½ν•΄μ•Ό 함
path 길이 증가 κ°€λŠ₯μ„± λŒ“κΈ€μ΄ κΉŠμ–΄μ§ˆμˆ˜λ‘ path 길이가 κΈΈμ–΄μ§ˆ 수 있음
INSERT μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯μ„± μƒˆλ‘œμš΄ λŒ“κΈ€ μΆ”κ°€ μ‹œ pathλ₯Ό 계산해야 함

πŸ—οΈ8️⃣ Path Enumeration(경둜 μ—΄κ±°) λ°©μ‹μ—μ„œ λŒ“κΈ€ μ €μž₯ κ·œμΉ™.

  • μœ„ κ·Έλ¦Όκ³Ό 같이, 각 depth(계측)λ³„λ‘œ 5개의 λ¬Έμžμ—΄λ‘œ 경둜 정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
    • 1 depthλŠ” 5자리 λ¬Έμžμ—΄, 2 depthλŠ” 10자리, 3 depthλŠ” 15자리 N depthλŠ” (N * 5)자리둜 ν‘œν˜„λ©λ‹ˆλ‹€.
  • 각 λŒ“κΈ€μ˜ κ²½λ‘œλŠ” λͺ¨λ“  μƒμœ„ λŒ“κΈ€μ—μ„œ ν•΄λ‹Ή λŒ“κΈ€κΉŒμ§€μ˜ 경둜λ₯Ό ν¬ν•¨ν•˜λ„λ‘ μ €μž₯λ©λ‹ˆλ‹€.
  • κ²½λ‘œλŠ” λΆ€λͺ¨ 경둜λ₯Ό μƒμ†ν•˜λ©°, λ…λ¦½μ μ΄λ©΄μ„œ 순차적인 ν˜•νƒœλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.
  • πŸ“Œ 이 방식은 λŒ“κΈ€μ˜ 계측 ꡬ쑰λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κ³ , μ •λ ¬ 및 검색을 효율적으둜 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

πŸ—οΈ9️⃣ Path Enumeration λ°©μ‹μ˜ κ³„μΈ΅ν˜• λŒ“κΈ€ ꡬ쑰 μ˜ˆμ‹œ

  • 쒌츑 그림의 κ³„μΈ΅ν˜• λŒ“κΈ€ κ΅¬μ‘°λŠ”, 우츑 κ·Έλ¦Όκ³Ό 같은 경둜 정보λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 각 κ²½λ‘œλŠ” λΆ€λͺ¨ λŒ“κΈ€μ˜ 경둜λ₯Ό μƒμ†λ°›μœΌλ©°, 각 λŒ“κΈ€λ§ˆλ‹€ 독립적이고 순차적인 경둜(λ¬Έμžμ—΄ μ •λ ¬ κΈ°μ€€)κ°€ μƒμ„±λ©λ‹ˆλ‹€.
  • πŸ“Œ 이 방식은 λŒ“κΈ€μ„ κ³„μΈ΅μ μœΌλ‘œ μ •λ ¬ν•˜κ³ , λΉ λ₯΄κ²Œ 검색할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

πŸ—οΈ1️⃣0️⃣ Path Enumeration λ°©μ‹μ—μ„œ 경둜 ν‘œν˜„ λ²”μœ„ ν™•μž₯ 방법

  • 각 κ²½λ‘œλŠ” depth(계측)λ§ˆλ‹€ 5자리의 문자둜 ν‘œν˜„λ˜λ―€λ‘œ, μ‚¬μš©ν•  수 μžˆλŠ” 경둜의 κ°œμˆ˜μ—λŠ” μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€.
    • λ§Œμ•½ 각 자릿수λ₯Ό 숫자 (0~9)둜만 μ‚¬μš©ν•œλ‹€λ©΄, ν•œ depthλ‹Ή 10⁡ = 100,000개(00000 ~ 99999)의 경둜만 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ λ¬Έμžμ—΄μ΄κΈ° λ•Œλ¬Έμ—, λ°˜λ“œμ‹œ 숫자(0~9)만 μ‚¬μš©ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.
    • 각 μžλ¦Ώμˆ˜λŠ” 0~9(10개), A~Z(26개), a~z(26개) 총 62개의 문자λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ¬Έμžμ—΄μ˜ μ •λ ¬ μˆœμ„œλŠ” 숫자(0~9) ➞ λŒ€λ¬Έμž μ•ŒνŒŒλ²³(A~Z) ➞ μ†Œλ¬Έμž μ•ŒνŒŒλ²³(a~z) μˆœμ„œλ‘œ μ§€μ •λ©λ‹ˆλ‹€.
    • λ”°λΌμ„œ, κ²½λ‘œλŠ” 00000λΆ€ν„° zzzzzκΉŒμ§€ 순차적으둜 μƒμ„±λ©λ‹ˆλ‹€.
    • 이 λ°©μ‹μ—μ„œλŠ” ν•œ depthλ‹Ή 62⁡ = 16,132,832개의 경둜λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • πŸ“Œ μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 경둜 ν‘œν˜„ λ²”μœ„λ₯Ό ν™•μž₯ν•˜λ©΄, 더 λ§Žμ€ λŒ“κΈ€μ„ μ €μž₯ν•  수 있으며 트리 ꡬ쑰λ₯Ό λ”μš± μœ μ—°ν•˜κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸš€ 정리.

  • βœ… Path Enumeration(경둜 μ—΄κ±°) 방식은 λŒ“κΈ€μ˜ 계측 ꡬ쑰λ₯Ό λ¬Έμžμ—΄(path)둜 μ €μž₯ν•˜λŠ” 방식
  • βœ… ORDER BY path ASCλ₯Ό μ‚¬μš©ν•˜μ—¬ 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ •λ ¬ κ°€λŠ₯
  • βœ… ν•˜μœ„ λŒ“κΈ€ 쑰회 μ‹œ LIKE β€˜κ²½λ‘œ%’λ₯Ό ν™œμš©ν•˜μ—¬ λΉ λ₯΄κ²Œ 검색 κ°€λŠ₯
  • βœ… λΆ€λͺ¨ λŒ“κΈ€μ΄ μ‚­μ œλ˜λ”λΌλ„ 계측 ꡬ쑰λ₯Ό μœ μ§€ν•˜λŠ” 데 유리
  • βœ… λŒ“κΈ€ 이동이 λΉˆλ²ˆν•œ 경우 path μ—…λ°μ΄νŠΈκ°€ ν•„μš”ν•˜λ―€λ‘œ 쑰심해야 함
  • βœ… Path Enumeration 방식은 λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ 및 쑰회 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλŠ” κ°€μž₯ 효과적인 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
  • βœ… 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ ORDER BY path ASC만으둜 정렬이 κ°€λŠ₯ν•˜μ—¬ μ„±λŠ₯이 μš°μˆ˜ν•©λ‹ˆλ‹€.
  • βœ… 경둜 길이가 κΈΈμ–΄μ§€λŠ” 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Base62와 같은 방식을 κ³ λ €ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
  • πŸ“Œ λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ 및 쑰회 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλŠ” κ°€μž₯ 효과적인 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.