SQLD · SQL 개발자

관계와 관계차수, 모델에서의 조인

모델 상의 관계가 실제 SQL 조인으로 어떻게 이어지는지를 묻는 영역입니다. ERD 를 읽고 어떤 조인이 필요한지, 관계차수가 결과 행 수에 어떤 영향을 주는지를 함께 따질 수 있어야 합니다.

이 주제에서 다루는 내용

  • 1:1, 1:M, M:N 관계와 M:N 의 해소
  • 관계의 필수·선택 참여가 외부 조인 필요성에 주는 신호
  • ERD 표기법 읽기
  • 관계 차수와 조인 결과 행 수의 관계
  • 외래키와 참조 무결성

자주 틀리는 지점

  • M:N 관계를 테이블 두 개로 그대로 구현할 수 있다고 보는 경우. 교차 엔터티가 필요합니다.
  • 선택적 참여 관계에 내부 조인을 써서 행이 누락되는 것을 놓치는 경우.
  • 관계차수를 보고 조인 결과 행 수를 항상 1:1 로 가정하는 경우.

연습문제 3문항

아래 문항은 오리지널 문제입니다. 기출문제가 아닙니다.

  1. 의료진 정보를 관리하는 DOCTOR 테이블과 진료 기록을 관리하는 TREATMENT 테이블 간의 관계 모델링을 검토하고 있다. 다음 ERD 설명 중 정규화와 관계 설정 관점에서 가장 적절한 것은? **DOCTOR 테이블** | DOC_ID | DOC_NAME | DEPT_CODE | DEPT_NAME | |--------|----------|-----------|------------| | D001 | 김내과 | INTERNAL | 내과 | | D002 | 이외과 | SURGERY | 외과 | **TREATMENT 테이블** | TREAT_ID | DOC_ID | PATIENT_ID | TREAT_DATE | |----------|--------|------------|------------| | T001 | D001 | P001 | 2024-01-15 | | T002 | D002 | P002 | 2024-01-16 |

    • A. DOCTOR 테이블은 제2정규화를 위반하고 있으며, DEPT_CODE와 DEPT_NAME을 별도 DEPARTMENT 테이블로 분리해야 한다.
    • B. TREATMENT 테이블의 DOC_ID는 DOCTOR 테이블과 1:N 관계를 형성하며, 외래키 제약조건으로 참조 무결성을 보장할 수 있다.
    • C. DOC_ID는 인조식별자이므로 본질식별자인 DOC_NAME을 기본키로 사용하는 것이 더 적절하다.
    • D. TREATMENT 테이블에서 DOC_ID가 NULL이면 무명 의사의 진료를 의미하므로 외래키 제약을 설정하면 안 된다.

    정답: B

    해설. 정답 B: TREATMENT 테이블의 DOC_ID는 DOCTOR 테이블의 기본키를 참조하는 외래키로, 한 명의 의사가 여러 건의 진료를 담당할 수 있는 1:N 관계를 올바르게 표현한다. A는 틀렸는데, DEPT_CODE와 DEPT_NAME이 DOC_ID에 완전 함수 종속되므로 제2정규화를 위반하지 않는다. C는 DOC_NAME은 중복 가능성이 있어 기본키로 부적절하며, D는 진료에는 반드시 담당 의사가 있어야 하므로 DOC_ID에 NULL을 허용할 이유가 없다.

  2. 다음 두 테이블과 관련된 설명 중 옳지 않은 것은? [고객 테이블] 고객ID | 고객명 | 등급 ------+-------+----- C001 | 김철수 | VIP C002 | 박영희 | 일반 C003 | 이민수 | VIP [주문 테이블] 주문ID | 고객ID | 주문일자 | 주문금액 ------+-------+-----------+--------- O001 | C001 | 2024-01-15| 150000 O002 | C002 | 2024-01-20| 80000 O003 | C001 | 2024-02-10| 200000 O004 | NULL | 2024-02-15| 50000 O005 | C004 | 2024-02-20| 120000

    • A. 고객 테이블의 고객ID는 기본식별자 역할을 하며, 주문 테이블에서는 외래키 제약조건(FK)이 실제로 설정·적용되고 있다.
    • B. 주문 테이블의 고객ID가 NULL인 경우(O004)는 익명 주문이나 게스트 주문을 나타낼 수 있다.
    • C. INNER JOIN으로 두 테이블을 조인하면 고객정보가 있는 3건의 주문만 조회된다.
    • D. 참조무결성이 완전히 유지된 상태라면 주문 테이블에 C004와 같이 존재하지 않는 고객ID는 입력될 수 없다.

    정답: A

    해설. 문항은 '옳지 않은 것'을 찾는 문제다. A는 주문 테이블에 FK 제약조건이 실제로 설정·적용되고 있다고 단정하지만, 주문 테이블에는 부모(고객 테이블)에 존재하지 않는 C004와 NULL 참조가 실제로 들어와 있다. FK가 적용 중이라면 이런 값은 애초에 입력될 수 없으므로, A는 주어진 데이터 상태와 모순된다. 따라서 A가 옳지 않은 설명이며 정답이다. B는 고객ID가 NULL인 O004를 익명·게스트 주문으로 해석할 수 있다는 서술로, NULL 참조에 대한 타당한 업무적 해석이므로 옳다. C는 고객 c INNER JOIN 주문 o ON c.고객ID=o.고객ID 수행 시 양쪽에 매칭되는 O001, O002, O003만 남으므로 3건이 맞아 옳다. D는 참조무결성이 완전히 유지된 상태를 가정하면 존재하지 않는 C004는 입력될 수 없다는 조건부 서술로, FK의 정의상 정확한 설명이므로 옳다.

  3. 유통업체의 주문 관리 시스템에서 주문(ORDER_TB) 테이블과 주문상세(ORDER_DETAIL) 테이블 간의 관계에 대한 설명으로 옳지 않은 것은?

    • A. 주문(ORDER_TB)의 기본키인 ORDER_ID가 주문상세(ORDER_DETAIL)의 외래키로 참조되어 1:M 관계를 형성한다.
    • B. 주문상세 테이블에서 ORDER_ID 컬럼은 NOT NULL 제약조건을 가져야 한다.
    • C. 주문 테이블과 주문상세 테이블을 조인할 때는 일반적으로 INNER JOIN을 사용한다.
    • D. 주문상세 테이블에는 주문 정보 없이 독립적으로 데이터가 존재할 수 있다.

    정답: D

    해설. 주문과 주문상세는 전형적인 부모-자식 관계로, 주문상세는 반드시 상위 주문에 종속되어야 한다. 따라서 주문상세 테이블에는 주문 정보 없이 독립적으로 데이터가 존재할 수 없다. A는 올바른 1:M 관계 설명이고, B는 외래키의 NOT NULL 제약이 맞으며, C는 일반적인 조인 방식이 맞다.

SQLD 연습문제 전체 풀기

같은 시험의 다른 주제