Home > Backend Development > πŸ“š[Backend Development] λ¬΄ν•œ depth λŒ“κΈ€ μ •λ ¬ κ΅¬μ‘°λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ“š[Backend Development] λ¬΄ν•œ depth λŒ“κΈ€ μ •λ ¬ κ΅¬μ‘°λž€ λ¬΄μ—‡μΌκΉŒμš”?
Backend Ddevelopment

β€œπŸ“š[Backend Development] λ¬΄ν•œ depth λŒ“κΈ€ μ •λ ¬ κ΅¬μ‘°λž€ λ¬΄μ—‡μΌκΉŒμš”?”

βœ… λ¬΄ν•œ Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰

  • λ¬΄ν•œ depth λŒ“κΈ€μ„ νŽ˜μ΄μ§• μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ •λ ¬ν•˜λŠ” μ „λž΅μ΄ ν•„μš”ν•©λ‹ˆλ‹€.
  • 보톡 parent_comment_id + comment_id μ •λ ¬ 방식을 μ‚¬μš©ν•˜λŠ” 2-depth λŒ“κΈ€κ³ΌλŠ” 달리, λ¬΄ν•œ depth의 경우 λŒ“κΈ€μ˜ 계측 ꡬ쑰λ₯Ό μœ μ§€ν•  수 μžˆλ„λ‘ μ •λ ¬ 방식이 κ°œμ„ λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

πŸš€1️⃣ 트리 ꡬ쑰 기반 μ •λ ¬ 방법

  • λ¬΄ν•œ depth의 λŒ“κΈ€μ„ μ •λ ¬ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 방식이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

1️⃣ μ •λ ¬ 방식

  • root_comment_id (μ΅œμƒμœ„ λΆ€λͺ¨ ID) μ˜€λ¦„μ°¨μˆœ
  • path (트리 μˆœμ„œ) μ˜€λ¦„μ°¨μˆœ
  • comment_id (μž‘μ„± μˆœμ„œ) μ˜€λ¦„μ°¨μˆœ
    • μ΄λ ‡κ²Œ μ •λ ¬ν•˜λ©΄ 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ λŒ“κΈ€μ„ μ‹œκ°„μˆœμœΌλ‘œ μ •λ ¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸš€2️⃣ 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λŠ” μ •λ ¬ ν•„λ“œ

ν•„λ“œλͺ… μ„€λͺ…
comment_id λŒ“κΈ€μ˜ 고유 ID (κΈ°λ³Έ ν‚€)
parent_comment_id λΆ€λͺ¨ λŒ“κΈ€μ˜ ID (μ΅œμƒμœ„ λŒ“κΈ€μ΄λ©΄ NULL)
root_comment_id μ΅œμƒμœ„ λΆ€λͺ¨ λŒ“κΈ€μ˜ ID (μ΅œμƒμœ„ λŒ“κΈ€μ΄λ©΄ 자기 μžμ‹  comment_id)
depth λŒ“κΈ€μ˜ 깊이 (0λΆ€ν„° μ‹œμž‘)
path 트리 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •λ ¬μš© λ¬Έμžμ—΄

πŸš€3️⃣ μ •λ ¬ μˆœμ„œ SQL 예제

πŸ“Œ λ¬΄ν•œ Depth 정렬을 μœ„ν•œ ORDER BY

SELECT * FROM comment
WHERE article_id = ?
ORDER BY root_comment_id ASC, path ASC, comment_id ASC
LIMIT ?, ?;

πŸ“Œ μ •λ ¬ κΈ°μ€€.

  • 1. root_comment_id ASC ➞ μ΅œμƒμœ„ λΆ€λͺ¨ λŒ“κΈ€ κΈ°μ€€μœΌλ‘œ μ •λ ¬
  • 2. path ASC ➞ 트리 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ •λ ¬
  • 3. comment_id ASC ➞ 같은 depth λ‚΄μ—μ„œ μž‘μ„± μˆœμ„œλŒ€λ‘œ μ •λ ¬

πŸš€4️⃣ path ν•„λ“œλž€?

  • 트리 ꡬ쑰λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ path ν•„λ“œλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • pathλŠ” λΆ€λͺ¨-μžμ‹ 관계λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•˜μ—¬ 정렬을 μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, pathλŠ” λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.
comment_id parent_comment_id root_comment_id depth path
1 NULL 1 0 00001
2 1 1 1 00001.00002
3 1 1 1 00001.00003
4 2 1 2 00001.00002.00004
5 4 1 3 00001.00002.00004.00005
  • πŸ“Œ μ •λ ¬ μ‹œ ORDER BY path ASCλ₯Ό μ‚¬μš©ν•˜λ©΄ 계측 ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ •λ ¬ κ°€λŠ₯!

πŸš€5️⃣ 정리

  • βœ… λ¬΄ν•œ depth λŒ“κΈ€ 정렬을 μœ„ν—€ path λ˜λŠ” lft/rgt 방식이 ν•„μš”
  • βœ… μ •λ ¬ μˆœμ„œλŠ” root_comment_id ASC, path ASC, comment_id ASC 방식 μ‚¬μš©
  • βœ… νŽ˜μ΄μ§• 처리 μ‹œ LIMIT ?,? 적용 κ°€λŠ₯
    • πŸ“Œ κΈ°μ‘΄ 2-depth λ°©μ‹μ²˜λŸΌ parent_comment_id μ •λ ¬λ§ŒμœΌλ‘œλŠ” λ¬΄ν•œ depth 정렬이 μ–΄λ €μš°λ―€λ‘œ pathλ₯Ό ν™œμš©ν•˜λŠ” 것이 κ°€μž₯ μ μ ˆν•©λ‹ˆλ‹€.