폴더 depth 깊은 메뉴 관리 설계는 어떻게 하나
self 조인으로 해 (이해 못했다ㅜㅜ)
depth만큼 테이블 컬럼을 추가해서 설계한다 (depth_n이 null이면 n이 depth지) 단점: depth가 깊어질수록 컬럼이 많아짐
depth라는 컬럼과 parent_id 컬럼을 둔다. depth에는 깊이 레벨값을, parent에는 본인의 부모의 폴더 아이디값을 넣는다.
깊이 3인 폴더 121일 때 depth = 3, parent = 2가 된다. (12폴더가 부모인데 2를 따왔다, 레벨이 2라서 2가 아니다!)
회사의 메뉴 관리를 보니 level이 1부터 3까지 있을 때 아래와 같은 형태를 띤다.
{
"level": 3,
"name": "이름",
"pid": "부모아이디(자신의 바로 위 레벨)",
"id": "본인아이디"
}
<select id="selectListMenu" resultType="map">
WITH RECURSIVE cte_menu AS (
SELECT
menu.menu_id
, menu.upr_menu_id
, menu.url
, loca.locale
, loca.display
, menu.sort_ordr
, 1 AS level
FROM
tbcm_menu menu
INNER JOIN tbcm_locale loca ON loca.key_type = 'menu'
AND loca.locale = #{g.locale}
AND menu.menu_id = loca.key_id
WHERE
menu.del_yn = 'N'
AND menu.upr_menu_id = '0'
UNION ALL
SELECT
menu.menu_id
, menu.upr_menu_id
, menu.url
, loca.locale
, loca.display
, menu.sort_ordr
, tb.level+1 AS level
FROM
tbcm_menu menu
INNER JOIN tbcm_locale loca ON loca.key_type = 'menu'
AND loca.locale = #{g.locale}
AND menu.menu_id = loca.key_id
INNER JOIN cte_menu tb ON menu.upr_menu_id = tb.menu_id
WHERE
menu.del_yn = 'N'
)
SELECT
menu_id AS id
, upr_menu_id AS pid
, display AS name
, level
FROM
cte_menu
ORDER BY
upr_menu_id, sort_ordr ASC
</select>
배너 정렬순서 등은 어떻게 하나
관리자의 재량껏 중복되지 않게 하드코딩하더라. 키즈는 그럼(중복체크 안함)