- 모델의 관계는 물리 모델에서 FK가 되고, SQL에서는 조인 조건이 된다. 관계를 보면 조인 경로가 보인다.
- 계층형 데이터 모델은 엔터티가 자기 자신과 관계를 맺는 구조다. SQL에서는 셀프 조인이나 계층형 질의로 읽는다.
- 상호배타적 관계는 한 엔터티가 두 엔터티 중 어느 하나와만 관계를 맺는 구조다(아크 관계).
- 함께 저장되어야 하는 트랜잭션 단위는 모델에서 필수 관계(양쪽 필수)로 표현한다.
기준: SQLD 출제 기준오류 제보
관계를 그려 놓은 모델은 "어느 테이블과 어느 테이블을 어떤 칼럼으로 이어야 하는가"를 이미 알려 준다.
| 단계 | DEPT와 EMP의 관계 |
|---|---|
| 논리 모델 | 부서는 여러 사원을 포함한다(1:M) |
| 물리 모델 | EMP.DEPTNO가 DEPT.DEPTNO를 참조하는 FK |
| SQL | ON E.DEPTNO = D.DEPTNO 라는 조인 조건 |
관계 하나를 SQL로 옮기면 다음과 같다.
SELECT D.DEPTNO, D.DNAME, COUNT(E.EMPNO) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM DEPT D LEFT OUTER JOIN EMP E ON D.DEPTNO = E.DEPTNO
GROUP BY D.DEPTNO, D.DNAME ORDER BY D.DEPTNO; DEPTNO DNAME EMP_CNT SAL_SUM
---------- -------------- ---------- ----------
10 ACCOUNTING 3 8750
20 RESEARCH 5 10875
30 SALES 6 9400
40 OPERATIONS 0모든 조인이 FK를 따르는 것은 아니다. SALGRADE는 EMP와 관계선이 없지만 급여 범위로 연결된다.
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E JOIN SALGRADE S ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE E.DEPTNO = 10 ORDER BY E.EMPNO;ENAME SAL GRADE
---------- ---------- ----------
CLARK 2450 4
KING 5000 5
MILLER 1300 2EMP의 MGR은 같은 EMP의 EMPNO를 가리킨다. 엔터티가 자기 자신과 관계를 맺는 구조다.
EMP
┌────────────┐
│ EMPNO PK │◄──┐
│ ENAME │ │ 관리자-부하 관계
│ MGR FK │───┘ (자기 참조, 순환 관계)
└────────────┘같은 테이블을 두 번 읽어 관리자 이름을 붙이는 것이 셀프 조인이다.
SELECT E.EMPNO, E.ENAME, E.MGR, M.ENAME AS MGR_NAME
FROM EMP E LEFT OUTER JOIN EMP M ON E.MGR = M.EMPNO
WHERE E.DEPTNO = 10 ORDER BY E.EMPNO; EMPNO ENAME MGR MGR_NAME
---------- ---------- ---------- ----------
7782 CLARK 7839 KING
7839 KING
7934 MILLER 7782 CLARKE는 사원 역할, M은 관리자 역할이다. 같은 EMP에 별칭을 둘 붙여 서로 다른 테이블처럼 쓴다.MGR이 NULL이라 일반 조인이면 빠진다. 여기서도 OUTER JOIN으로 남겼다.START WITH … CONNECT BY 계층형 질의를 쓴다. 6주차 범위다.⚠️ 함정: 계층형 데이터 모델은 하나의 엔터티 안에서 상하 관계가 생기는 구조다. "두 개의 엔터티가 계층을 이룬다"거나 "계층형 모델에서는 셀프 조인을 쓸 수 없다"는 보기는 틀린다.
주문을 넣는 주체가 개인고객일 수도, 법인고객일 수도 있다. 한 주문은 둘 중 한 쪽과만 관계를 맺는다.
개인고객 ─┐
├── (둘 중 하나) ──< 주문
법인고객 ─┘트랜잭션은 함께 성공하거나 함께 실패해야 하는 작업 묶음이다. 1과목에서 묻는 것은 이 묶음이 모델에 어떻게 드러나는가이다.
주문과 주문상품을 예로 든다.
| 관계 표기 | 모델이 말하는 것 | 트랜잭션 |
|---|---|---|
| 주문 ↔ 주문상품 양쪽 필수 | 서로가 없으면 존재할 수 없다 | 하나의 트랜잭션으로 묶어 함께 커밋 |
| 부서 → 사원 선택(부서 쪽에서) | 사원 없는 부서도 존재한다 | 부서만 먼저 등록하는 별도 트랜잭션이 가능 |
주문 주문상품
┌──────────┐ ┌────────────┐
│ 주문번호 │|──────<│ 주문번호 │ 양쪽 필수(|)
│ 주문일자 │ │ 상품번호 │ → 주문 INSERT 와 주문상품 INSERT 를
└──────────┘ │ 수량 │ 한 트랜잭션으로 묶는다
└────────────┘내일은 NULL이 연산과 집계에서 어떻게 동작하는지, 그리고 본질식별자와 인조식별자의 차이를 다룬다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
사원 엔터티의 "관리자사번" 속성이 같은 사원 엔터티의 "사번"을 참조한다. 이 모델에 대한 설명으로 가장 알맞은 것은?
문제 2
주문은 개인고객 또는 법인고객 중 어느 한 쪽과만 관계를 맺는다. 이 관계를 무엇이라 하는가?
문제 3
주문과 주문상품이 하나의 트랜잭션으로 함께 저장되어야 한다는 업무 규칙을 데이터 모델에 가장 적절하게 표현한 것은?
문제 4
DEPT와 EMP가 "부서는 사원을 0명 이상 가진다"는 관계로 모델링되어 있다. 사원이 없는 부서까지 모두 부서별 인원과 함께 조회하려 할 때 알맞은 방법은?
문제 5
데이터 모델의 관계와 조인에 대한 설명으로 가장 적절하지 않은 것은?