폴더 depth 깊은 메뉴 관리 설계는 어떻게 하나

  1. self 조인으로 해 (이해 못했다ㅜㅜ)

  2. depth만큼 테이블 컬럼을 추가해서 설계한다 (depth_n이 null이면 n이 depth지) 단점: depth가 깊어질수록 컬럼이 많아짐

  3. depth라는 컬럼과 parent_id 컬럼을 둔다. depth에는 깊이 레벨값을, parent에는 본인의 부모의 폴더 아이디값을 넣는다.

Untitled

깊이 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>

배너 정렬순서 등은 어떻게 하나

관리자의 재량껏 중복되지 않게 하드코딩하더라. 키즈는 그럼(중복체크 안함)