IT/DataBase

[DBMS] N:M(다대다) 관계일 때 매핑 테이블로 관계 형성

알 수 없는 사용자 2023. 9. 24.
반응형

다대다 관계

하나의 메뉴는 여러개의 유저그룹과 연결될 수 있고 나의 유저그룹도 여러개의 메뉴정보와 연결될 수 있기에 다대다 관계라고 할 수 있다.(회원과 유저그룹도 마찬가지다)

예를 들어 회원관리라는 메뉴를 A그룹도 가질 수 있고 B그룹도 가질 수 있다.

A그룹은 회원관리 뿐 아니라 시스템관리의 메뉴와도 연결될 수 있다.

관계형 데이터베이스에서는 다대다 관계를 풀어내기 위해 중간에 매핑 테이블을 둬서 1:N, N:1로 관계를 품

매핑 테이블은 연결시키는 테이들의 PK만을 가지고 있고 이를 가지고 각 테이블에서 서로 참조할 수 있다.

위의 관계에서 회원이 자신과 연결된 메뉴정보를 알고 싶으면 아래처럼 쿼리를 작성하면 된다.

/* 사용자와 매핑된 메뉴 조회 */
    WITH UserGroupCodes AS (
        /* 유저그룹코드 조회 */
        SELECT USER_GROUP_CD
          FROM USER_USER_GROUP_MAPPING
         WHERE USER_ID = 'lsy'
    /* 메뉴코드 조회 */
    ), MenuCodes AS (
        SELECT MENU_CD
         FROM MENU_USER_GROUP_MAPPING
        WHERE USER_GROUP_CD IN (SELECT USER_GROUP_CD FROM UserGroupCodes)
    )                       
    /* 최종 메뉴 정보 조회 */
    SELECT A.MENU_CD AS menuCd    /* 메뉴코드 */
         , A.MENU_NAME AS menuName  /* 메뉴명 */
         , A.MENU_URL AS menuUrl   /* 메뉴 url */
         , A.MENU_CD_SEQ AS menuCdSeq    /* 메뉴 노출 순서 */
         , A.UPPER_MENU_CD AS upperMenuCd/* 상위코드 */
     FROM MENU_INFO A
    WHERE A.MENU_CD IN (SELECT MENU_CD FROM MenuCodes)  
      AND A.USE_YN = 'Y'

회원 테이블은 메뉴테이블과 전혀 관계가 없으니 매핑 테이블을 이용해야 한다.

게임처럼 이해하면 쉽다.

메뉴정보라는 보스몹을 잡기 위해 유저그룹코드메뉴코드라는 아이템을 얻어야 한다. 

본인의 아이디로 유저그룹코드를 먼저 구한 뒤 전열을 다음어 다시 메뉴코드를 얻는다.(순서대로 해야 함)

그 뒤 메뉴코드를 통해 최종 보스몹인 메뉴정보를 정복한다.


결과(보스 몹 사냥)

개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

틀린 점 있을 경우 댓글 부탁드립니다.

반응형

댓글

💲 추천 글