현재 선택한 데이터 아키텍처 과정

DAsP 이론 학습

이론 목록으로 돌아가기

논리-물리 모델 변환

논리-물리 변환은 엔터티·속성·식별자·관계의 업무 의미와 무결성을 DBMS 객체로 보존하는 매핑 작업입니다. 기본 1:1 치환뿐 아니라 M:N, 1:1, 재귀 관계, 서브타입, 이력, 코드, 파생값의 변환 전략과 변환 사유를 기록해야 합니다.

예상 읽기 8

핵심 요약

논리 모델의 엔터티는 보통 테이블, 속성은 컬럼, 식별자는 PK·UK, 관계는 FK로 변환된다. 그러나 이 규칙만으로는 충분하지 않다. 관계의 선택성·삭제 규칙, 서브타입 구현, 이력의 현재행·기간 제약, 코드값 통제, 파생값 저장 여부를 DBMS가 강제할 수 있는 형태로 구체화해야 한다. 변환 결과가 논리 의미를 잃지 않았는지 논리-물리 매핑표와 DDL 대조로 확인한다.

학습 목표

  • 논리 요소를 테이블·컬럼·키·제약으로 변환한다.
  • 1:N, M:N, 1:1, 재귀 관계의 FK 배치와 제약을 설계한다.
  • 서브타입의 대표 물리 구현 전략과 장단점을 비교한다.
  • 이력·코드·파생 속성의 변환과 추적성 문서를 작성한다.

1. 기본 변환 원칙

1.1 엔터티와 속성

논리 요소일반적인 물리 객체추가 결정
엔터티테이블테이블명, 저장 특성, 소유 스키마
속성컬럼데이터 타입, 길이·정밀도, NULL, 기본값
주식별자PK자연키/대리키, 컬럼 순서, 생성 방식
대체식별자UK 또는 유일 인덱스·업무 통제NULL 의미, 조건부 유일성
도메인타입·CHECK·참조 코드·공통 도메인제품 지원과 변경 관리
파생 속성계산 컬럼·뷰·저장 컬럼·미구현계산 시점과 정합성 책임

논리 속성 하나가 물리 컬럼 여러 개로 분해될 수 있다. 예를 들어 논리적 주소를 우편번호·기본주소·상세주소로 구현하거나, 금액을 금액값과 통화코드로 구현할 수 있다. 반대로 여러 논리적 플래그를 하나의 비트마스크 컬럼에 압축하면 의미·제약·조회성이 약해질 수 있으므로 변환 사유가 필요하다.

1.2 데이터 타입 매핑

논리 도메인의 의미를 먼저 정한 뒤 DBMS 타입을 선택한다.

  • 금액: 범위·소수점·반올림을 고려한 정확 숫자형
  • 일자와 시각: 일자만 필요한지, 시간대가 필요한지 구분
  • 코드: 허용값·길이·문자 비교 규칙과 일치
  • 긴 텍스트·바이너리: 최대 크기, 검색 여부, 외부 저장 여부
  • 식별자: 값 범위·생성량·외부 연계 형식 고려

VARCHAR(4000)처럼 넉넉한 길이를 일괄 적용하면 도메인 검증이 약해지고 행 길이·인덱스·전환에 영향을 줄 수 있다.

2. 관계 변환 패턴

2.1 1:N 관계

부모 PK를 자식의 FK로 둔다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
고객 1 ─── N 주문

CUSTOMER(CUSTOMER_ID PK, ...)
ORDERS(ORDER_ID PK, CUSTOMER_ID FK, ...)
  • 자식이 반드시 부모를 가져야 하면 FK 컬럼을 NOT NULL로 설계한다.
  • 부모 삭제 시 RESTRICT, CASCADE, SET NULL 중 어떤 의미가 맞는지 업무 규칙으로 결정한다.
  • 식별 관계라면 부모키가 자식 PK 일부에 포함될 수 있다.

2.2 M:N 관계

교차·연관 엔터티를 테이블로 변환해 두 개의 1:N 관계로 해소한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
주문 M ─── N 상품
      ↓
주문라인(주문번호 PK/FK, 라인순번 PK, 상품번호 FK, 수량, 거래단가)

단순히 (주문번호, 상품번호)를 PK로 두면 같은 상품을 한 주문에 여러 라인으로 담을 수 없는지 확인해야 한다. 논리 식별자와 업무 반복 규칙에 따라 라인순번 또는 별도 식별자를 선택한다.

2.3 1:1 관계

FK를 어느 쪽에 둘지는 다음을 고려한다.

  • 어느 쪽이 생명주기상 종속되는가?
  • 어느 쪽 참여가 선택/필수인가?
  • 함께 조회·생성되는가?
  • 보안·성능·변경주기가 다른가?

FK에는 UNIQUE를 추가해야 1:N으로 확장되는 것을 막을 수 있다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
회원 1 ─── 0..1 회원민감정보
MEMBER_SENSITIVE(
  MEMBER_ID PK/FK,
  ...
)

민감정보가 회원 없이 존재할 수 없고 회원당 최대 한 건이면 자식 PK를 동시에 FK로 사용하는 방식이 자연스럽다.

2.4 재귀 관계

조직의 상위조직 관계는 같은 테이블을 참조하는 FK로 변환할 수 있다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
ORGANIZATION(
  ORG_ID PK,
  PARENT_ORG_ID FK NULL REFERENCES ORGANIZATION(ORG_ID)
)

최상위 조직은 부모가 없으므로 NULL을 허용할 수 있다. 자기 자신 참조 금지, 순환 금지, 최대 깊이 같은 규칙은 일반 FK만으로 모두 보장되지 않을 수 있다.

3. 서브타입 변환 전략

전략구조장점위험·적합 조건
단일 테이블슈퍼·서브 속성을 한 테이블에 저장, 유형코드 사용조회·삽입 단순, 조인 없음유형별 NULL 증가, 유형별 필수 제약 복잡
슈퍼+서브 테이블공통 테이블과 유형별 테이블, 동일 PK/FK논리 상속과 무결성 표현이 명확조회 조인, 판별자-서브행 일치 통제
서브타입별 통합 테이블각 구체 유형 테이블에 공통 속성 반복유형별 독립 처리 단순공통 속성 중복, 전체 유형 조회·공통 FK 어려움

논리 서브타입이 있다고 특정 전략이 자동 결정되지 않는다. 유형 수, NULL 비율, 공통 조회, FK 참조, 유형 전환, 제약 구현 가능성을 비교한다.

예: 슈퍼+서브 테이블

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
CUSTOMER(
  CUSTOMER_ID PK,
  CUSTOMER_TYPE_CODE NOT NULL,
  CUSTOMER_NAME NOT NULL
)

PERSON_CUSTOMER(
  CUSTOMER_ID PK/FK REFERENCES CUSTOMER,
  BIRTH_DATE NOT NULL
)

CORPORATE_CUSTOMER(
  CUSTOMER_ID PK/FK REFERENCES CUSTOMER,
  CORPORATE_REG_NO NOT NULL UNIQUE
)

추가로 CUSTOMER_TYPE_CODE='P'이면 개인 테이블 행만 존재해야 한다는 배타·완전 규칙을 구현해야 한다.

4. 특수 논리 구조의 변환

4.1 이력

기간 이력은 업무키와 유효시작을 키로 사용하거나 별도 버전 식별자를 둘 수 있다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
CONTRACT_TERM_HISTORY(
  CONTRACT_ID,
  VALID_FROM,
  VALID_TO,
  RATE,
  PRIMARY KEY(CONTRACT_ID, VALID_FROM),
  CHECK(VALID_FROM < VALID_TO)
)

PK와 CHECK만으로 기간 중복이 모두 방지되는 것은 아니다. 제품 기능 또는 트랜잭션 검증이 추가로 필요할 수 있다.

4.2 코드

코드가 자주 바뀌고 명칭·유효기간·분류 같은 속성을 가지면 코드 테이블과 FK로 구현한다. 값이 매우 안정적이고 소수이며 시스템 전역에서 동일하다면 CHECK 제약을 검토할 수 있으나 변경 배포 방식까지 고려한다.

4.3 파생값

  • 조회 시 계산: 원천과 항상 일치하지만 계산 비용 발생
  • 뷰·계산 컬럼: 식을 중앙화하되 제품 지원 차이 존재
  • 저장 컬럼: 읽기는 빠르지만 갱신·재계산·오류 복구 규칙 필요
  • 요약 테이블: 대량 집계에 유리하지만 갱신 지연과 재생성 필요

저장 파생값은 반정규화에 해당할 수 있으므로 82600043의 근거·통제 기준을 적용한다.

5. 논리-물리 매핑표

논리 객체물리 객체변환 방식제약·검증변환 사유
고객.고객번호CUSTOMER.CUSTOMER_ID숫자형 대리키PK외부키 변화와 분리
고객.고객식별번호CUSTOMER.CUSTOMER_BIZ_NO문자열UK, NOT NULL 조건업무 대체식별자 보존
고객-주문 1:NORDERS.CUSTOMER_ID부모키 이관FK, NOT NULL주문은 고객 필수
고객 서브타입CUSTOMER + 유형별 테이블슈퍼+서브PK/FK, 유형 일치유형별 필수속성 명확
계약조건 이력CONTRACT_TERM_HIST기간행시작<종료, 중복검증과거 효력 재현

이 표는 DDL 생성 후 역대조 기준이 된다. 논리 요소가 매핑되지 않거나 물리 객체에 대응 논리 근거가 없으면 검토 대상이다.

6. 변환 검증 흐름

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
논리 객체 목록 확정
  ↓
명명·타입·NULL·기본값 매핑
  ↓
주·대체 식별자와 관계를 PK·UK·FK로 변환
  ↓
M:N·1:1·재귀·서브타입·이력 전략 선택
  ↓
파생값·코드·업무 무결성 구현 위치 결정
  ↓
논리-물리 매핑표 작성
  ↓
DDL·샘플 데이터·삭제/변경 시나리오로 의미 보존 검증

시험 판단 포인트

  • 1:N 관계의 FK는 일반적으로 N쪽에 배치하며 필수 관계는 FK NULL 허용과 함께 확인한다.
  • 1:1 관계는 FK에 유일성 제약이 없으면 물리적으로 1:N이 될 수 있다.
  • M:N 관계는 연관 테이블로 해소하고 관계 자체의 속성을 그 테이블에 둔다.
  • 대체식별자는 논리 모델에서 사라지지 않으며 UK나 별도 업무 통제로 구현한다.
  • 서브타입의 논리 제약과 물리 구현 전략을 구분한다.
  • 변환 완료 여부는 테이블 수가 아니라 논리 규칙의 보존과 매핑 추적성으로 판단한다.

자주 틀리는 부분

  • 주식별자만 PK로 옮기고 대체식별자의 유일성 규칙을 빠뜨린다.
  • 선택 관계인데 FK를 무조건 NOT NULL로 지정하거나, 필수 관계인데 NULL을 허용한다.
  • 1:1 FK에 UNIQUE를 두지 않아 여러 자식 행이 허용된다.
  • 서브타입을 단일 테이블로 합치면서 유형별 필수 속성 제약을 모두 제거한다.
  • 코드명만 저장하고 코드 식별값·유효성·참조 규칙을 관리하지 않는다.
스스로 확인하기

개념 확인 문제

문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.

01객관식 고객 1명은 여러 주문을 가질 수 있고 주문은 반드시 한 고객에 속한다. 일반적인 물리 변환은? A. 고객 테이블에 주문번호 FK를 둔다. B. 주문 테이블에 고객번호 NOT NULL FK를 둔다. C. 고객번호와 주문번호를 한 컬럼에 저장한다. D. 관계를 구현하지 않는다.
정답 및 해설

정답: B

  • B: 1:N 관계에서는 부모 고객의 PK를 N쪽 주문에 FK로 둔다. 주문이 고객에 필수 종속하므로 NOT NULL도 함께 검토한다.
  • A: 고객 한 행에 주문번호 하나만 두면 여러 주문을 표현할 수 없다.
  • C: 두 식별자의 의미와 제약을 잃는다.
  • D: 참조 무결성을 구현하지 못한다.
02객관식 회원과 회원민감정보가 1:0..1 관계다. 회원민감정보 테이블의 회원번호가 PK이면서 회원 FK인 경우 얻는 효과는? A. 회원당 민감정보 여러 건을 허용한다. B. 회원 없이 민감정보가 존재하고 회원당 최대 한 건이라는 규칙을 표현한다. C. 회원당 최대 한 건이며 회원 없는 민감정보를 방지한다. D. FK가 없어도 동일한 효과가 난다.
정답 및 해설

정답: C

  • C: PK는 회원번호의 중복을 막아 회원당 최대 한 건을 보장하고, FK는 존재하는 회원만 참조하게 한다.
  • A: PK 때문에 여러 건이 허용되지 않는다.
  • B: FK 때문에 회원 없는 민감정보는 허용되지 않는다.
  • D: PK만으로는 회원 존재 여부를 확인할 수 없다.
03참·거짓 “논리 모델에 서브타입이 있으면 물리 모델은 반드시 슈퍼타입 테이블과 모든 서브타입 테이블로 분리해야 한다.”
정답 및 해설

정답: 거짓

단일 테이블, 슈퍼+서브 테이블, 서브타입별 통합 테이블 등 여러 전략이 있다. 논리 제약을 보존하면서 조회·NULL·FK·유형 전환·제약 구현을 비교해 선택한다.

04변환 설계 논리 모델에 학생 M:N 과목 관계가 있고 관계 속성으로 수강학기·성적이 있다. 물리 테이블과 키·FK를 설계하시오.
정답 및 해설

모범 답안

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
STUDENT(
  STUDENT_ID PK,
  ...
)

COURSE(
  COURSE_ID PK,
  ...
)

ENROLLMENT(
  STUDENT_ID PK/FK REFERENCES STUDENT,
  COURSE_ID PK/FK REFERENCES COURSE,
  TERM_CODE PK,
  GRADE_CODE,
  ...
)

같은 학생이 같은 과목을 여러 학기에 재수강할 수 있다면 수강학기를 PK에 포함해야 한다. 재수강이 불가능하다면 (학생ID, 과목ID)가 키가 될 수 있다. 성적은 관계 자체에 종속되므로 연관 테이블에 둔다.

05DDL 판독 다음 DDL이 논리적 1:1 관계를 완전하게 보장하는지 판단하고 보완하시오. sql CREATE TABLE MEMBERPROFILE ( PROFILEID BIGINT PRIMARY KEY, MEMBERID BIGINT NOT NULL, BIO VARCHAR(500), FOREIGN KEY (MEMBERID) REFERENCES MEMBER(MEMBERID) );
정답 및 해설

모범 답안

제시 DDL은 회원별 여러 프로필 행을 허용하므로 1:1을 완전히 보장하지 않는다. MEMBER_ID에 UNIQUE를 추가하거나 회원번호를 PK/FK로 사용한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
CREATE TABLE MEMBER_PROFILE (
  MEMBER_ID BIGINT PRIMARY KEY,
  BIO VARCHAR(500),
  FOREIGN KEY (MEMBER_ID) REFERENCES MEMBER(MEMBER_ID)
);

별도 PROFILE_ID가 업무상 필요하다면 다음처럼 보완한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UNIQUE (MEMBER_ID)

삭제 동작과 회원민감정보의 생명주기 규칙도 함께 결정해야 한다.