본문 바로가기

개념·논리 모델과 정규화: 뜻을 잃지 않고 표를 나눈다

앞 절의 문구점은 과거 주문의 단가와 배송지를 보존하기로 했다. 이제 고객·상품·주문을 표로 만들면 끝일까. 이름이 같은 고객을 합치거나, 한 주문의 같은 상품 두 줄을 하나로 합치거나, 표를 잘못 나눠 없던 거래가 생기면 칸이 아무리 깔끔해도 요구를 만족하지 못한다.

1. 표가 깔끔한데 지난 주문이 틀린 이유

앞 절의 문구점은 과거 주문의 단가와 배송지를 보존하기로 했다. 이제 고객·상품·주문을 표로 만들면 끝일까. 이름이 같은 고객을 합치거나, 한 주문의 같은 상품 두 줄을 하나로 합치거나, 표를 잘못 나눠 없던 거래가 생기면 칸이 아무리 깔끔해도 요구를 만족하지 못한다.

모델링은 현실의 뜻을 구조로 옮기는 일이다. 무엇을 한 건으로 볼지, 무엇으로 구별할지, 몇 건까지 연결되는지, 어떤 사실이 다른 사실을 결정하는지를 차례로 확인한다. 이 절에서는 완성된 표와 반례를 읽으며 그 판단이 왜 필요한지 따라간다.

먼저 되찾을 세 문장

데이터 모델은 대상·속성·관계·제약의 표현이고, 행을 유일하게 구별하는 최소 속성 집합이 후보키이며, 선택한 기본키 외의 후보키도 유일성 규칙을 잃지 않는다(테이블·행·열·키·관계). 정규화는 사실의 종속을 따라 중복과 삽입·수정·삭제 이상을 줄이고, 무결성은 값·키·참조·업무규칙을 계속 지키는 성질이다(정규화·중복·무결성). 고객의 현재주소와 주문 당시 배송지는 처음 값이 같아도 다른 시점·범위의 사실이다(데이터 요구사항·업무규칙·용어: 무엇을 사실로 남길 것인가).

업무 계약을 대상·관계·제약으로 바꾼다

데이터 모델링은 업무규칙을 대상·속성·관계·제약으로 표현하고 개념·논리·물리 수준을 거쳐 데이터 구조로 구체화하는 과정이다. 개념 수준은 업무 의미를, 논리 수준은 선택한 데이터 모델의 구조와 키·종속·제약을, 물리 수준은 특정 DBMS의 실제 저장·접근 방식을 다룬다.

문구점에서는 먼저 고객이 주문하고 주문이 항목을 가진다는 의미를 정한다. 그다음 관계형 표와 키로 표현하고, 마지막에 제품의 자료형과 인덱스를 선택한다. 이 절은 앞의 두 수준과 정규화 판단을 맡으며 물리 선택의 정식 설명은 물리 DB 설계·인덱스·파티션으로 이어진다.

같은 요구를 잃지 않고 세 번 구체화한다

R04의 조건을 모델·검증에 이어 간다

상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.

R04의 조건을 모델·검증에 이어 간다확정 주문은 1줄 이상이며 동일상품 여러 줄을 허용한다. 개념 관계의 최소·최대 수를 논리 표와 검증으로 구체화하고, 제품별 자료형·제약·접근·저장은 다음 절에서 선택한다.rule → conceptconcept → logicallogical → verifyverify → physical요구 R04: 확정 주문 1줄 이상 동일상품 여러 줄 허용요구 R04확정 주문 1줄 이상동일상품 여러 줄 허용개념 관계: 주문·주문항목·상품 연결의 최소·최대 수개념 관계주문·주문항목·상품연결의 최소·최대 수논리 표: 주문번호·항목번호 상품·수량·확정단가논리 표주문번호·항목번호상품·수량·확정단가규칙 검증: 같은 상품 1·2번 줄 허용 수량 0 거절규칙 검증같은 상품 1·2번 줄 허용수량 0 거절다음 절: 물리 설계: 자료형·제약·접근·저장 제품별 선택다음 절: 물리 설계자료형·제약·접근·저장제품별 선택
R04의 조건을 모델·검증에 이어 간다확정 주문은 1줄 이상이며 동일상품 여러 줄을 허용한다. 개념 관계의 최소·최대 수를 논리 표와 검증으로 구체화하고, 제품별 자료형·제약·접근·저장은 다음 절에서 선택한다.rule → conceptconcept → logicallogical → verifyverify → physical요구 R04: 확정 주문 1줄 이상 동일상품 여러 줄 허용요구 R04확정 주문 1줄이상동일상품 여러 줄허용개념 관계: 주문·주문항목·상품 연결의 최소·최대 수개념 관계주문·주문항목·상품연결의최소·최대 수논리 표: 주문번호·항목번호 상품·수량·확정단가논리 표주문번호·항목번호상품·수량·확정단가규칙 검증: 같은 상품 1·2번 줄 허용 수량 0 거절규칙 검증같은 상품 1·2번줄 허용수량 0 거절다음 절: 물리 설계: 자료형·제약·접근·저장 제품별 선택다음 절: 물리설계자료형·제약·접근·저장제품별 선택

확정 주문은 1줄 이상이며 동일상품 여러 줄을 허용한다. 개념 관계의 최소·최대 수를 논리 표와 검증으로 구체화하고, 제품별 자료형·제약·접근·저장은 다음 절에서 선택한다.

왼쪽에서 오른쪽으로 이름만 바꾸는 변환이 아니다. 규칙을 표현하지 못한 곳은 요구를 다시 확인하고, 구조를 바꾸었으면 반례도 다시 확인한다. 개념 설계와 정규화는 서로의 누락을 발견하는 두 관점이다.

앞에서 모델링은 업무 의미를 구조와 제약으로 구체화하는 과정임을 보았다. 행의 식별과 연결을 맡는 키의 기초(테이블·행·열·키·관계)를 바탕으로, 이제 구별해서 기록할 대상 자체부터 정한다.

2. 명사를 찾은 뒤에는 한 건의 뜻을 묻는다

엔터티 유형은 같은 종류의 식별 가능한 업무 대상을 모아 정의한 것이다. 인스턴스는 그 유형에 속한 실제 한 대상이고, 속성은 대상에 관해 기록하는 성질이다. 이 절에서 짧게 고객 엔터티라고 할 때는 유형을 뜻하고 고객 C1은 인스턴스를 뜻한다.

고객 유형의 C1은 현재주소 B라는 속성값을 가진다. 주문 O101은 배송지 A를 가진다. 둘 다 주소 문자열이지만 서로 다른 대상의 속성이므로 하나의 열로 합칠 근거가 되지 않는다.

네 대상과 두 숫자를 구별한다

후보한 건의 뜻따로 다루는 이유
고객주문 전에도 등록할 수 있는 사람·거래상대주문 없이도 독립적으로 존재
상품판매할 하나의 품목주문 없이 가격·명칭 관리
주문고객이 확정하는 한 거래날짜·배송지·상태가 거래 전체에 속함
주문항목주문 안에서 번호로 구별하는 한 줄같은 상품도 다른 줄로 반복 가능
수량그 줄에서 산 개수이 사례에서는 독립 대상이 아니라 항목의 속성
주문합계그 주문의 항목금액 합이 사례에서는 계산으로 얻는 값

문장에 나온 모든 명사가 엔터티가 되지는 않는다. 고유한 사실과 변경 이유가 있는지, 독립 식별이 필요한지, 여러 값이 붙는지 확인한다. 반대로 화면에서 한 칸이라고 해서 항상 속성 하나로 끝나는 것도 아니다. 여러 배송지를 따로 관리해야 한다는 요구가 생기면 배송지의 독립 대상화 여부를 다시 판단한다.

앞에서 엔터티 유형과 그에 속한 실제 대상을 구별했고, 이전 절에서는 규칙에 적용 조건과 예외를 함께 적었다(데이터 요구사항·업무규칙·용어: 무엇을 사실로 남길 것인가). 이제 한 대상이 다른 대상과 얼마나 연결될 수 있는지를 그 업무규칙으로 확인한다.

관계의 양 끝에는 최소와 최대가 있다

관계는 업무 대상 사이의 의미 있는 연결이다. 카디널리티는 한 대상과 연결될 수 있는 상대 대상의 수이며, 최소 수는 연결이 필수인지 선택인지를 드러낸다. 여기서는 0..N을 0개 이상 여러 개, 1..1을 정확히 하나라는 범례로 사용한다.

고객 1 대 주문 N이라는 최대 수만 쓰면 주문 없는 고객을 허용하는지 알 수 없다. 고객 한 명의 주문은 0..N이지만 주문 한 건의 고객은 1..1이라고 두 방향을 읽어야 한다. N은 무한 저장 용량의 보장이 아니라 업무상 여러 개를 허용하는 표기다.

작성중과 확정 상태의 최소 수가 다르다

한 대상을 기준으로 읽기상대 수규칙 근거
고객 한 명이 가진 주문0..N고객은 주문 전 등록 가능
주문 한 건의 고객1..1주문의 고객 필수
작성중 주문 한 건의 항목0..N아직 빈 주문 허용
확정 주문 한 건의 항목1..N빈 주문 확정 금지
항목 한 줄의 주문·상품각각 1..1어느 주문의 어떤 상품인지 필수
상품 한 개가 등장한 항목0..N미판매 상품 허용

관계도에는 모든 상태별 조건을 담기 어려우므로 주문 0..N 항목의 기본 구조 옆에 확정 시 1개 이상이라는 규칙을 붙인다. 단순 외래키만으로 부모 주문에 자식 항목이 하나 이상인지까지 보장한다고 답하면 안 된다.

업무 의미로 읽는 개념 모델

주문항목이 거래의 줄을 식별한다

상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.

주문항목이 거래의 줄을 식별한다선은 저장 위치가 아니라 업무 관계다. 고객은 주문 없이, 상품은 판매 없이 존재할 수 있다. 주문의 고객과 항목의 주문·상품은 각각 하나가 필수이며, 작성중 0줄과 확정 시 1줄 이상 조건을 구분한다. 정확한 양방향 수는 바로 위 표와 함께 읽는다.customer → order: 고객 0..N 주문order → line: 작성중 0..N / 확정 1..Nproduct → line: 상품 0..N 항목고객 0..N 주문작성중 0..N / 확정1..N상품 0..N 항목주문: 주문일·배송지·상태 취소 시 사유 필수주문주문일·배송지·상태취소 시 사유 필수고객: 현재주소고객현재주소상품: 현재판매가격상품현재판매가격주문항목: 주문 안의 항목번호 수량·확정단가주문항목주문 안의 항목번호수량·확정단가
주문항목이 거래의 줄을 식별한다선은 저장 위치가 아니라 업무 관계다. 고객은 주문 없이, 상품은 판매 없이 존재할 수 있다. 주문의 고객과 항목의 주문·상품은 각각 하나가 필수이며, 작성중 0줄과 확정 시 1줄 이상 조건을 구분한다. 정확한 양방향 수는 바로 위 표와 함께 읽는다.customer → order: 고객 0..N 주문order → line: 작성중 0..N / 확정 1..Nproduct → line: 상품 0..N 항목고객 0..N 주문작성중 0..N / 확정1..N상품 0..N 항목주문: 주문일·배송지·상태 취소 시 사유 필수주문주문일·배송지·상태취소 시 사유 필수고객: 현재주소고객현재주소상품: 현재판매가격상품현재판매가격주문항목: 주문 안의 항목번호 수량·확정단가주문항목주문 안의 항목번호수량·확정단가

선은 저장 위치가 아니라 업무 관계다. 고객은 주문 없이, 상품은 판매 없이 존재할 수 있다. 주문의 고객과 항목의 주문·상품은 각각 하나가 필수이며, 작성중 0줄과 확정 시 1줄 이상 조건을 구분한다. 정확한 양방향 수는 바로 위 표와 함께 읽는다.

고객과 상품을 직접 선으로 이으면 어느 주문에서 얼마에 몇 개 샀는지가 사라진다. 주문과 상품의 여러 대 여러 연결을 주문항목이라는 거래 줄로 표현하면 연결 자체에 수량·단가·줄 번호를 붙일 수 있다. 도식과 표는 이 교재가 직접 만든 문구점 사례다.

앞에서 관계의 양 끝을 읽어 최소·최대 수와 상태별 조건을 확인했다. 표의 행은 키로 식별하고 참조 키로 연결한다는 기초(테이블·행·열·키·관계)를 바탕으로, 이 관계를 표 안의 제약으로 옮긴다.

3. 관계를 표와 키로 옮긴다

관계형 논리 변환은 업무 대상·속성·관계를 관계형 표·열·키·참조 제약으로 바꾸는 절차다. 부모의 키가 자식의 기본키 일부가 되는 것을 식별 관계, 자식의 기본키에는 포함되지 않고 외래키로 연결되는 것을 비식별 관계라고 부른다. 이 구분은 이 절의 관계형 설계 표기 관례이며 연결이 필수인지와는 다른 축이다.

주문항목의 기본키를 (주문번호, 항목번호)로 잡으면 주문번호가 식별에 참여한다. 반대로 주문은 자기 주문번호가 기본키이고 고객번호는 필수 외래키이므로 고객과 비식별 관계다. 비식별 = 고객 없이 주문 가능이 아니며 필수 여부는 별도 제약으로 정한다.

최대 수와 최소 수를 서로 다른 제약으로 옮긴다

개념 관계·속성논리 변환의 출발점놓치기 쉬운 조건
1 대 NN쪽에 1쪽 키를 참조하는 외래키필수 연결이면 빈값을 허용하지 않음
1 대 1한쪽에 외래키와 유일성 제약어느 쪽이 필수인지, 분리할 생명주기인지 확인
N 대 M두 대상을 연결하는 별도 표연결 자체의 날짜·수량·순번도 확인
여러 개의 독립 속성값대상 키와 값으로 별도 표 검토쉼표 목록의 일부를 검색·제약해야 하는지 확인
자기 자신과의 관계같은 표를 참조하되 양쪽 역할을 구별관리자·부하처럼 방향과 순환 허용 여부 확인

이 표는 가장 흔한 출발점이며 관계 수만 보고 기계적으로 결정하지 않는다. 두 엔터티를 한 표로 합치는 1 대 1 변환도 가능한 경우가 있지만 선택 속성·보호·변경 이유가 다르면 분리 판단이 달라진다. 세 대상이 함께 정하는 거래를 세 개의 두 대상 관계로 쪼개도 되는지는 뒤의 조인 반례에서 확인한다.

현재정보와 주문시점 사실을 보존하는 네 표

고객(고객번호, 고객명, 현재주소)
  기본키: 고객번호

상품(상품번호, 상품명, 현재판매가격)
  기본키: 상품번호

주문(주문번호, 고객번호, 주문일, 배송지, 주문상태, 취소사유)
  기본키: 주문번호 / 필수 외래키: 고객번호 → 고객

주문항목(주문번호, 항목번호, 상품번호, 주문확정단가, 수량)
  기본키: (주문번호, 항목번호)
  필수 외래키: 주문번호 → 주문, 상품번호 → 상품

괄호 안은 열 목록이고 기본키·외래키는 바로 아래에 명시했다. 주문번호는 O101과 O102를, 항목번호는 한 주문 안의 1번과 2번 줄을 구별한다. 항목번호만으로는 다른 주문의 1번 줄을 구별할 수 없다.

R06의 취소사유는 주문 한 건의 별도 속성으로 저장한다. 이 사례는 취소에서 확정으로 직접 되돌리지 않는 단일 상태전환을 다루므로 별도 취소 이력 표까지 요구하지 않는다. 작성중·확정에서는 사유가 없을 수 있지만 취소 상태에는 비어 있지 않은 사유가 있어야 한다. 취소 처리 담당은 허용된 상태전환인지 확인하고 상태와 사유를 같은 처리단위로 기록하며, 원주문의 배송지·확정단가·수량을 바꾸지 않는다. 사유 정정 이력이나 여러 차례의 취소·복구가 필요해지면 그 요구와 기록 구조를 별도로 설계한다.

대리키인 별도 항목ID를 기본키로 선택해도 (주문번호, 항목번호)의 유일성이 업무 규칙이면 별도 유일성 제약을 남겨야 한다. 새 번호를 붙이는 것은 식별자의 표현을 바꾸는 것이지 기존 업무 규칙을 지우는 일이 아니다.

값이 같아도 갱신되는 곳은 다르다

주문번호고객번호주문일배송지주문상태취소사유
O101C19월 1일A확정없음(NULL)
O102C19월 3일B확정없음(NULL)
주문번호항목번호상품번호주문확정단가수량
O1011P110,0002
O1012P21,0003
O1021P112,0001

9월 3일 고객 표의 C1 현재주소는 B이고 상품 표의 P1 현재가격은 12,000원이다. O101의 단가가 10,000원인 것은 복사값 갱신을 잊은 오류가 아니다. 현재가격과 확정단가가 다른 사실이라는 요구를 제대로 표현한 결과다.

작성중 주문에 같은 P1 두 줄을 서로 다른 항목번호로 담은 뒤 확정하는 것도 R04가 허용하는 사례다. 이미 확정된 O101의 항목을 나중에 직접 바꾼다는 뜻은 아니다. 따라서 (주문번호, 상품번호)를 유일키로 선언하면 허용된 업무를 잘못 거절한다. 앞 절의 규칙을 표의 반례까지 따라온 이유다.

한 열의 제약과 여러 행의 규칙을 구분한다

요구논리적 책임제품 구현으로 넘길 확인사항
고객번호 유일·필수기본키·유일성과 필수 제약빈값·유일성의 제품별 처리
주문의 고객 참조·항목의 주문/상품 참조경로별 외래키와 필수 여부대상 삭제 시 거절·연쇄·이력 보존
수량은 양의 정수자료 영역과 값 검사자료형·필수 제약을 함께 적용
확정 주문에 항목 1개 이상주문·항목과 상태를 함께 판단확정 처리단위와 동시 변경을 고려
R06 취소 시 사유 기록·원주문 보존주문의 취소사유가 비어 있지 않음; 원래 배송지·확정단가·수량 유지상태·사유를 함께 기록하고 취소→확정 직접전환 거절
주문합계가 항목금액 합여러 행의 계산 또는 일관된 요약변경·취소·재계산의 처리 책임

정규화·중복·무결성에서 NULL과 값 검사·필수 제약을 구분했다. 그 원리를 주문항목에 적용하면 수량이 양수이면서 반드시 존재해야 하므로 CHECK(수량 > 0)와 NOT NULL을 함께 둔다. PostgreSQL 18의 CHECK가 미정 결과도 허용한다는 경계를 적용한 것이며 모든 업무 규칙을 CHECK 하나로 표현한다는 뜻이 아니다.

확정 순간의 최소 항목 수는 한 행만 보는 값 검사로 끝나지 않는다. 주문 확정과 항목 변경이 동시에 일어날 때도 규칙을 지키는 처리단위가 필요하다. 트랜잭션의 원자성·격리 원리는 트랜잭션의 네 성질(ACID)의 정의를 적용하고 세부 동시성 제어는 뒤 절에서 다룬다.

예를 들어 O101을 취소하면서 사유를 NULL이나 빈 문자열로 남기는 변경은 거절한다. 사유 고객 요청과 취소 상태를 함께 기록한 뒤에도 배송지 A, 두 항목의 확정단가·수량과 그 합계 23,000원은 원주문 기록으로 남아야 한다. 취소를 표현하려고 수량을 0으로 만들거나 행을 삭제하지 않는다. 상태별 사유 검사는 현재 행의 값 규칙이고, 허용된 전환과 과거값 보존 검사는 변경 전후를 함께 다루는 책임이다.

4. 값이 무엇에 달려 있는지 화살표로 본다

앞서 배운 함수적 종속을 여기서는 X → Y로 적는다. X와 Y는 한 열일 수도 여러 열의 집합일 수도 있으며, X값이 같은 허용 행들은 Y값도 같아야 한다. 시간에 따라 상품가격을 바꾸는 일을 금지한다는 뜻이 아니라 같은 데이터 상태에서 무엇이 하나로 정해지는지의 규칙이다.

문구점의 업무 계약으로부터 다음 종속을 얻는다.

결정하는 속성결정되는 속성근거
고객번호고객명·현재주소한 고객의 현재 상태
상품번호상품명·현재판매가격한 상품의 현재 상태
주문번호고객번호·주문일·배송지·상태한 주문의 거래 사실
주문번호·항목번호상품번호·확정단가·수량한 주문 줄의 거래 사실

상품번호 → 주문확정단가는 성립하지 않는다. 같은 P1이 O101에서는 10,000원, O102에서는 12,000원이기 때문이다. 지금 몇 행에서 우연히 성립한 패턴과 모든 허용 상태에 적용할 업무 종속을 구분한다.

정규화는 사실의 종속을 따라 중복과 갱신이상을 줄이는 판단이고, 후보키는 행을 유일하게 구별하는 최소 속성 집합이었다(테이블·행·열·키·관계, 정규화·중복·무결성). 집합은 구별되는 원소의 모음이고, 함수는 각 입력에 출력 하나를 대응시키는 규칙이었다(집합·관계·함수와 좌표). 이제 주어진 종속으로 결정되는 속성을 모아 본다.

화살표를 끝까지 따라가면 키인지 확인할 수 있다

속성 폐쇄 X⁺는 정해진 함수적 종속들을 반복 적용하여 X에서 결정할 수 있는 모든 속성의 집합이다. 주요 속성은 적어도 하나의 후보키에 포함되는 속성이고, 비주요 속성은 어떤 후보키에도 포함되지 않는 속성이다. 기본키 하나만 보고 주요 속성을 정하지 않는다.

화살표 왼쪽의 여러 속성은 모두 갖추어야 한다. 주문번호·항목번호 → 상품번호·수량은 주문번호와 항목번호를 함께 알고 있을 때만 적용한다. 주문번호 하나를 알고 있다고 상품번호를 추가해서는 안 된다. 폐쇄 계산은 이미 모은 속성 안에 어떤 규칙의 왼쪽 전체가 들어 있는지 확인하고, 들어 있을 때 오른쪽을 더하는 일을 더 늘어나지 않을 때까지 반복한다.

X⁺가 표의 모든 속성을 포함하면 X는 슈퍼키다. 그 안의 속성을 하나라도 뺐을 때 모두 결정하지 못하면 최소성이 확인되어 후보키가 된다. 위의 주문 줄에서는 주문번호+항목번호로 줄의 값과 주문·고객의 값을 따라갈 수 있지만 주문번호만으로 줄 번호·상품·수량을 정할 수는 없다.

폐쇄 계산을 네 단계로 읽는다

검사를 위해 R(주문번호, 항목번호, 상품번호, 상품명, 수량)을 잠시 사용한다. 규칙은 주문번호·항목번호 → 상품번호·수량, 상품번호 → 상품명뿐이라고 가정한다.

단계현재 결정할 수 있는 속성적용한 이유
시작주문번호·항목번호검사할 집합 자체
1위 두 속성 + 상품번호·수량주문 줄의 종속
2위 네 속성 + 상품명상품번호의 종속
종료R의 모든 속성더 추가할 속성 없음

항목번호를 빼면 한 주문에 여러 상품이 있어 실패한다. 주문번호를 빼면 다른 주문의 같은 줄 번호가 섞여 실패한다. 따라서 이 규칙 집합에서는 둘을 함께 쓴 집합이 후보키다. 실제 데이터 몇 행에서 줄 번호가 우연히 겹치지 않더라도 결과는 바뀌지 않는다.

화살표를 이어 주문번호·항목번호 → 상품명을 얻는 것은 정해진 규칙의 논리적 결과다. 주어진 규칙 전체를 F, 그로부터 얻을 수 있는 모든 함수적 종속을 F⁺라고 적는다. 앞의 X⁺는 속성의 집합, F⁺는 종속 규칙의 집합이므로 기호가 닮았어도 대상이 다르다.

규칙 하나를 뺀 변형. 같은 다섯 열을 쓰되 상품번호 → 상품명을 더는 가정하지 않고, 주문번호·항목번호 → 상품번호·수량만 유효하다고 하자. (주문번호, 항목번호)⁺의 계산은 어느 단계에서 멈추며, 이 두 열이 여전히 후보키인가? 상품명까지 결정하려면 검사 집합에 무엇을 더해야 할까?

먼저 풀어 본 뒤 해설과 교정 보기

해설과 교정. 시작의 두 열에 상품번호·수량을 추가한 네 열에서 멈춘다. 상품명을 얻는 화살표가 사라졌으므로 전체 다섯 열에 도달하지 못해 두 열은 슈퍼키가 아니다. 상품명을 처음부터 가진 (주문번호, 항목번호, 상품명)은 다섯 열을 모두 얻고, 셋 중 하나를 빼면 각각 주문번호·항목번호·상품명을 얻지 못하므로 이 조건의 후보키다. 상품번호가 있으니 상품명도 당연히 안다는 답은 폐쇄 계산에 없는 업무규칙을 끼워 넣은 것이다. 위 상태표의 각 추가 열 옆에 실제 적용한 종속을 써 보고, 근거가 없는 추가를 지운다. 실제 업무에서 이름을 상품번호로 결정하려면 그 규칙을 다시 확인해 명시해야 하며, 이 변형은 원래 문구점의 규칙을 변경한 교육 가정이다.

화살표 추론의 세 가지 안전한 규칙

규칙쉬운 읽기사례
반사이미 가진 값의 일부는 안다주문번호·항목번호 → 주문번호
증가양쪽에 같은 속성을 더해도 성립한다상품번호 → 상품명이면 상품번호·창고번호 → 상품명·창고번호
이행앞의 결과가 다음 원인이면 연결한다주문번호 → 고객번호, 고객번호 → 현재주소이면 주문번호 → 현재주소

이 세 추론 규칙을 암스트롱 공리라고 부른다. 늘려 쓸 수 있다는 말은 업무에 없던 새로운 종속을 마음대로 가정한다는 뜻이 아니다. 현재주소를 논리적으로 찾을 수 있어도 그것을 과거 주문 배송지와 같은 의미로 취급할 수 없다는 경계도 그대로 남는다.

한 표의 반복은 서로 다른 세 실패를 만든다

주문항목마다 상품명·현재판매가격·고객현재주소까지 반복 저장한다고 가정하자. 모든 행이 같은 현재 사실을 뜻하기 때문에 같은 상품의 현재가격을 바꿀 때 관련 행이 모두 따라 바뀌어야 한다.

이상구체적인 실패나눌 사실
삽입 이상주문이 없는 새 상품을 주문항목에만 저장할 수 없음상품 자체의 사실
수정 이상P1 현재가격을 일부 주문 줄에서만 바꿈현재가격의 단일 소유 위치
삭제 이상마지막 주문 줄을 지우며 상품명·가격까지 잃음주문과 독립적인 상품 정보

이 표의 현재판매가격과 앞의 주문확정단가를 혼동하면 정규화 결론이 거꾸로 된다. 당시 단가는 주문 줄의 정당한 사실이므로 상품 현재가격과 같게 만들려고 분리·재계산해서는 안 된다.

1정규형부터 3정규형까지 실제로 나누는 이유

정규화 기초에서 읽은 첫째·둘째·셋째 정규형의 판단을 이 사례에 적용한다. 정규형의 약자는 Normal Form의 NF를 붙여 1NF·2NF·3NF로 쓰며 모두 관계의 제약을 판정하는 이름이다. 속성을 나누기 전에는 후보키와 업무 종속을 먼저 확인한다.

단계이 사례에서 발견한 원인구조 변화
1NF 적용한 칸에 P1·P2와 수량 목록이 들어 있으면 줄별 식별·검사가 어려움한 주문 줄을 한 행으로 표현
2NF 적용복합 후보키의 주문번호만으로 주문일·고객·배송지가 결정됨주문과 주문항목 분리
3NF 적용주문번호 → 고객번호 → 고객현재주소의 다른 사실이 섞임고객현재주소는 고객으로 분리
나머지 종속 점검상품번호 → 상품명·현재가격이 주문 줄에 섞임상품 표 분리, 확정단가는 주문 줄에 유지

이처럼 단계는 분해 이유를 드러내기 위한 읽기 순서이지 모든 설계에서 정확히 네 번의 표 분할을 강제하는 절차가 아니다. 이미 올바른 개념 모델에서 시작했다면 네 표가 처음부터 나오며 정규화는 그 구조를 다시 검증한다.

기본키 하나의 생김새만으로 정규형을 판정하지 않는다

여러 후보키가 있는 문제에서는 기초 절의 정의를 모든 후보키와 비주요 속성에 적용해야 한다. 2NF는 1NF를 전제로 비주요 속성이 어느 후보키의 진부분집합에도 종속되지 않아야 하며, 3NF는 1NF 관계의 비자명한 X → A마다 X가 슈퍼키인지 또는 A가 주요 속성인지 확인한다. 이 문장은 앞의 원칙을 엄밀하게 적용하기 위한 판정 범위다.

여기서 진부분집합은 적어도 하나를 뺀 더 작은 집합이며, 비자명한 종속은 오른쪽 속성이 이미 왼쪽 안에 들어 있는 당연한 종속이 아닌 경우다. 상품번호·상품명 → 상품번호는 자명하지만 상품번호 → 상품명은 업무 근거가 필요한 비자명한 종속이다.

별도 일련번호 하나를 기본키로 추가해도 기존 복합 후보키·종속·갱신 이상이 자동으로 없어지지 않는다. 숫자 키의 열 수 대신 전체 후보키와 사실의 결정 관계를 검사해야 한다.

앞에서 속성 폐쇄로 어떤 값이 다른 값을 결정하는지 확인하고 키의 최소성을 따졌다. 정규화로 표를 나눈 뒤에도 원래의 사실과 규칙이 유지되는지는 각각 다시 확인해야 한다.

5. 나눈 표를 합쳤을 때 원래 사실만 돌아와야 한다

무손실 분해는 주어진 제약을 만족하는 모든 원래 관계를 분해한 표들에서 다시 결합했을 때 정확히 복원할 수 있는 분해다. 종속 보존은 나눈 각 표에 적용할 수 있는 종속들을 함께 지키는 것으로 원래의 모든 종속을 보장할 수 있는 성질이다. 하나는 사실의 복원, 다른 하나는 규칙 검사 책임을 묻는다.

열을 선택해 관계를 만드는 투영은 이 절에서 중복 행을 하나로 보는 집합 연산으로 읽는다. 자연조인은 공통 이름의 속성값이 같은 행끼리 결합하는 연산이다. SQL의 중복 행·빈값 처리와 완전히 같은 것으로 가정하지 않고, 지금은 빈값이 없는 관계 이론의 조건을 검사한다.

원래 두 행인데 잘못 나누면 네 행이 된다

원래 관계를 (주문, 고객, 상품)으로 잠시 단순화하고 아래 두 행만 있다고 하자.

주문고객상품
O1C1P1
O2C1P2

이를 (주문, 고객)과 (고객, 상품)으로 나누면 어느 상품이 어느 주문에 있었는지 연결 근거를 잃는다. 고객 C1로 조인한 결과는 다음과 같다.

주문고객상품원래 있었는가
O1C1P1있음
O1C1P2없음: 잘못 생긴 조합
O2C1P1없음: 잘못 생긴 조합
O2C1P2있음

손실이라는 이름인데 행이 늘어나는 이유는 원래 조합을 구별하던 정보가 사라졌기 때문이다. 지금 예제에서 두 표의 공통 고객번호는 주문이나 상품을 하나로 결정하지 못한다. 고객별 구매 상품 목록은 만들 수 있어도 주문의 거래 줄을 그대로 대체할 수는 없다.

공통 속성이 한쪽 표를 결정하면 안전하게 붙는다

관계 R을 R1·R2 두 표로 나눌 때, 공통 속성이 R1 전체 또는 R2 전체를 함수적으로 결정하면 무손실이다. 함수적 종속만을 제약으로 삼는 경우에는 이것이 두 표 분해의 필요충분조건이다. 다른 종류의 제약까지 있으면 이 조건을 충족하지 않는다는 이유만으로 곧바로 손실이라고 단정하지 않는다.

문구점의 주문번호·고객번호·주문일·항목번호·상품번호·단가·수량을 주문과 주문항목으로 나누자. 공통 속성은 주문번호이고 주문번호 → 주문 전체가 성립한다. 각 항목은 정확히 한 주문의 값과 결합하므로 다른 주문의 고객·날짜를 붙이지 않는다.

두 표의 열을 합쳐 원래 열 전체를 포함해야 한다는 조건도 먼저 필요하다. 공통 열이 있다는 사실만, 혹은 예제 한 번의 조인 결과가 맞았다는 사실만으로 모든 허용 상태의 무손실성을 증명한 것은 아니다.

잘 복원되어도 규칙을 따로 검사하기 어려울 수 있다

간단히 R(주문번호, 고객번호, 현재주소)와 주문번호 → 고객번호, 고객번호 → 현재주소를 보자. 주문번호는 현재주소도 결정한다.

분해무손실 근거종속 보존
주문고객(주문번호, 고객번호) + 고객주소(고객번호, 현재주소)공통 고객번호가 고객주소 전체를 결정두 원래 종속을 각 표에서 검사 가능
주문고객(주문번호, 고객번호) + 주문주소(주문번호, 현재주소)공통 주문번호가 양쪽을 결정고객번호 → 현재주소를 두 표의 개별 규칙만으로 보장 못 함

둘째 분해에서 O1과 O2가 같은 C1인데 각각 주소 A·B를 가지면 각 표의 주문번호 유일성은 지킨다. 하지만 같은 고객의 현재주소가 달라 원래 종속을 위반한다. 이 예의 주소는 거래 당시 배송지가 아니라 동일한 현재주소라는 조건이 핵심이다.

종속 보존의 판단 범위는 원래 화살표마다 반드시 한 표가 있어야 한다는 단순 육안 기준보다 넓다. 나눈 표들의 종속으로 원래 화살표를 추론할 수 있어도 보존이다. 위 둘째 분해에서는 그 추론도 불가능하므로 별도 결합 검사나 설계 변경이 필요하다.

앞에서 폐쇄와 키의 충분성·최소성을 확인했고, 분해에서는 사실의 정확한 복원과 종속 보존을 구별했다. 이 기준을 유지한 채, 이제 결정하는 쪽이 행 전체를 식별하는지를 더 엄격하게 묻는다.

6. 더 높은 정규형이 다루는 추가 중복

BCNF(Boyce–Codd Normal Form)는 모든 비자명한 함수적 종속의 왼쪽이 슈퍼키인 정규형이다. 3NF가 오른쪽 주요 속성을 허용하는 예외를 두는 데 비해 BCNF는 그 예외 없이 결정하는 쪽의 식별 능력을 요구한다.

주문·상품 → 담당자, 담당자 → 상품이라는 규칙이 있는 배정 표를 생각하자. 담당자는 상품 하나만 맡지만 여러 주문을 처리하므로 담당자 하나만으로 모든 배정 행을 구별하지는 못한다. 담당자와 담당상품의 사실이 여러 주문에서 반복되는 것이 BCNF가 잡는 중복이다.

모든 열이 주요 속성이어도 반복은 남을 수 있다

이 배정 표는 주문항목 본표와 별도인 작은 비교 사례다. 주문·상품 한 쌍에는 담당자 한 명만 배정하고, 담당자 한 명은 상품 하나만 맡으며, 한 상품을 맡을 수 있는 담당자는 여러 명이라고 가정한다.

주문상품담당자
O1P1K1
O2P1K1
O3P2K2

(주문, 상품)⁺도 (주문, 담당자)⁺도 세 열 전체이며 각각 최소이므로 두 후보키가 있다. 세 열 모두 어느 후보키엔가 속한다. 따라서 담당자 → 상품에서 상품이 주요 속성이어서 3NF는 만족하지만, 담당자는 슈퍼키가 아니어서 BCNF는 만족하지 않는다.

담당상품(담당자, 상품)과 주문담당(주문, 담당자)으로 분해하면 공통 담당자가 앞 표를 결정하여 무손실이며 두 표는 BCNF다. 그러나 K1·K2가 모두 P1을 맡고 주문 O1에 둘 다 붙어도 각 표의 키는 지킨다. 원래의 주문·상품 → 담당자를 위반하므로 이 분해는 그 종속을 보존하지 않는다.

무손실과 규칙 보존 중 무엇을 확인하는 절차인가

BCNF 분해는 위반 종속 X → Y를 찾아 X와 Y를 가진 표와 Y 중 X에 없는 속성을 원래 표에서 뺀 표로 나눈 뒤 반복한다. 이 방식은 공통 X가 첫 표를 결정하게 하여 무손실을 확보한다. 다만 분해 뒤 종속 보존은 별도로 검사해야 한다.

종속 보존도 필요하면 3NF 합성 절차를 사용할 수 있다. 먼저 오른쪽을 한 속성씩 나누고 불필요한 왼쪽 속성·중복 종속을 제거한 최소 덮개를 구한다. 같은 왼쪽 종속을 묶어 표를 만들고, 어느 표에도 원래 후보키가 포함되지 않으면 후보키 표를 추가한 뒤 다른 표에 완전히 포함된 표를 정리한다.

최소 덮개는 원래와 같은 종속을 함의하면서 불필요한 부분을 제거한 규칙 묶음이며 한 가지 모양으로만 정해지지는 않는다. 3NF 합성은 적절한 이 절차와 함수적 종속의 조건 아래 무손실·종속 보존을 얻는 방법이다. 항상 더 높은 정규형만 선택 대신 남은 중복과 규칙을 검사하는 비용·책임을 비교한다.

이 과정을 네 열짜리 임시 관계 R(주문번호, 항목번호, 고객번호, 고객현재주소)에 적용해 보자. 이 관계에서는 주문번호가 고객번호·고객현재주소를 결정하고, 고객번호가 고객현재주소를 결정한다고 가정한다. 여기에 주문번호·항목번호 → 고객번호라는 중복 규칙도 적혀 있다고 하자. 항목번호를 결정하는 다른 규칙은 없으며, 이 임시 예의 주소는 과거 배송지가 아니라 같은 시점의 고객현재주소다.

읽기 단계남기는 규칙·표왜 이렇게 되는가
오른쪽을 한 열씩 나눔주문번호→고객번호, 주문번호→고객현재주소, 고객번호→고객현재주소, 주문번호·항목번호→고객번호여러 결론을 하나씩 검사하기 위함
왼쪽의 불필요한 열과 중복 제거마지막 규칙의 항목번호를 빼고, 이미 있는 주문번호→고객번호와 중복된 규칙을 제거주문번호만으로 고객번호를 결정하는 근거가 이미 있음
추론 가능한 중복 규칙 제거주문번호→고객번호, 고객번호→고객현재주소주문번호→고객현재주소는 남은 두 규칙으로 다시 얻음
종속별 표 구성주문고객(주문번호, 고객번호), 고객주소(고객번호, 고객현재주소)각 규칙을 자기 표에서 검사할 수 있음
후보키 포함 여부 확인주문항목번호(주문번호, 항목번호) 추가앞 두 표에는 원래 후보키 전체가 없으므로 추가해야 함

원래 관계의 후보키는 (주문번호, 항목번호)다. 주문번호로 고객과 주소를 따라갈 수 있지만 항목번호는 얻을 수 없고, 항목번호만으로 주문번호도 알 수 없기 때문이다. 마지막 표를 빼면 같은 주문에 몇 번 항목이 있었는지 잃는다. 규칙을 줄이는 작업과 원래 사실을 복원하는 작업을 별도로 확인하는 이유가 이 작은 예에서도 드러난다.

앞에서 BCNF는 모든 비자명한 함수적 종속의 왼쪽에 슈퍼키를 요구했고, 분해의 무손실성과 종속 보존은 별개로 보았다. 이제 한 값이 다른 하나를 결정하는 상황을 넘어, 앞의 분해 원칙으로 여러 값 묶음의 반복을 살펴본다.

서로 독립인 여러 값의 조합이 반복될 때

다치 종속(Multivalued Dependency, MVD) X →→ Y는 같은 X에 대해 Y의 값들이 나머지 속성값들과 독립적으로 조합되어야 하는 제약이다. 4NF는 비자명한 다치 종속의 왼쪽이 슈퍼키여야 하는 정규형이다. 한 값이 여러 개 있다는 사실만으로 독립성까지 증명한 것은 아니다.

문구점 고객 C1이 선호하는 연락수단 두 개와 관심분류 두 개를 서로 독립적으로 등록한다고 하자. 전화 선호가 공책에만, 전자우편 선호가 펜에만 적용되는 것이 아니라면 두 묶음의 모든 조합을 한 표에 반복할 이유가 없다.

2개와 2개를 4행으로 곱해서 적을 필요가 있는가

고객선호 연락수단관심분류
C1전화공책
C1전화펜
C1전자우편공책
C1전자우편펜

고객 하나에 연락수단과 관심분류가 각각 두 개이므로 독립 조건을 만족하려면 2×2=4행을 저장한다. 새 관심분류를 하나 추가하면 기존 연락수단 둘과의 조합도 둘 다 추가해야 한다. 한 조합을 빠뜨리면 독립이라는 업무 규칙과 다른 의미가 된다.

고객연락(고객, 연락수단)과 고객관심(고객, 관심분류)으로 나누면 각각 두 행으로 두 사실을 표현한다. 고객으로 조인하면 필요한 네 조합이 정확히 돌아오므로 이 조건에서 무손실이다. X →→ Y가 자명한 경우는 Y가 X 안에 있거나 X와 Y가 전체 속성을 덮는 경우이며, 위 세 열에서는 고객→→연락수단이 그 어느 경우도 아니고 고객이 키도 아니므로 4NF를 위반한다.

반대로 전화는 공책에만, 전자우편은 펜에만 사용이라는 실제 선호가 두 행이라면 독립 조건이 없다. 이를 둘로 나눠 조인하면 원래 금지한 두 조합이 생긴다. 같은 칼럼 모양이라도 업무 의미에 따라 분해 결론이 달라진다.

앞에서 독립적인 값 묶음의 모든 조합을 다치 종속으로 표현했고, 분해한 표를 합쳐 원래 사실만 복원해야 함을 확인했다. 이제 두 묶음에만 한정하지 않고 여러 투영의 결합에서도 같은 복원 질문을 유지한다.

두 묶음으로는 드러나지 않는 조합 규칙도 있다

조인 종속(Join Dependency, JD)은 관계를 정해진 여러 속성 집합으로 투영한 뒤 모두 자연조인하면 모든 허용 상태에서 원래 관계가 복원된다는 제약이다. 5NF는 성립하는 모든 조인 종속이 후보키 제약들로부터 함의되는 정규형이다. 5NF는 투영과 조인을 기준으로 한 정규형이며 모든 가능한 업무 오류가 사라진다는 뜻이 아니다.

세 대상의 연결을 두 대상씩의 관계로 바꾸는 판단이 대표적이다. 고객이 어떤 상품을 살 수 있고, 어떤 매장을 이용할 수 있으며, 그 매장이 그 상품을 팔면 그 고객의 구매 조합도 항상 허용되는지 묻는다. 실제 세 대상별 계약이 따로 있으면 이 추론은 성립하지 않는다.

세 쌍이 모두 맞아야 허용되는 경우와 별도 계약인 경우

문구점의 구매가능(고객, 상품, 매장)이라는 별도 정책을 가정한다. 고객·상품 허용, 고객·매장 허용, 상품·매장 취급의 세 조건을 모두 만족하면 그 세 대상 조합도 반드시 허용된다는 규칙이다. 이 규칙 아래 다음 네 조합이 허용되어 있다고 하자.

고객상품매장
C1P1M1
C1P1M2
C1P2M1
C2P1M1

이를 고객상품 {C1P1, C1P2, C2P1}, 고객매장 {C1M1, C1M2, C2M1}, 상품매장 {P1M1, P1M2, P2M1} 세 관계로 표현한다. 공백 없이 붙인 표기는 쌍을 짧게 적은 것이며 문자열 하나를 뜻하지 않는다.

고객상품과 고객매장만 조인하면 C1·P2·M2가 잠시 생기지만 상품매장에 P2·M2가 없어 마지막 조인에서 제외된다. 세 표를 모두 조인하면 위 네 행만 돌아온다. 어느 두 열도 후보키가 아니므로 이 조인 종속은 단순 키 제약에서 나온 것이 아닌 별도 업무 규칙이다.

이제 마지막이 아니라 첫 행 C1·P1·M1을 금지한 별도 계약을 상상해 보자. 나머지 세 행에는 C1P1·C1M1·P1M1 쌍이 여전히 각각 남아 있어 세 표의 조인은 금지 행을 다시 만든다. 따라서 실제 개별 구매 허가를 저장하는 경우에는 세 쌍의 허용만으로 바꾸면 안 된다. 삼자 관계를 항상 이자 관계로 분해한다는 암기 대신 조인 종속의 업무 근거와 반례를 함께 확인한다.

높은 정규형은 서로 다른 종류의 반복을 검사한다

기초 절에서 배운 함수적 종속은 FD로 표시한다. 앞서 읽은 MVD는 다치 종속, JD는 조인 종속이다. 아래 표는 각 규칙이 어떤 중복을 잡는지 같은 축으로 비교한다.

판정무엇을 묻는가이 절의 반례·적용
3NF비자명 FD에서 왼쪽 슈퍼키 또는 오른쪽 주요 속성인가배정 표의 담당자→상품 허용
BCNF비자명 FD의 왼쪽이 슈퍼키인가담당상품의 반복을 분리하되 종속 보존 확인
4NF비자명 MVD의 왼쪽이 슈퍼키인가독립인 연락수단·관심분류를 분리
5NFJD가 후보키 제약으로 함의되는가세 쌍으로 삼자 구매가능성을 복원할 업무 근거 확인

여기서는 3NF→BCNF→4NF→5NF로 갈수록 더 강한 조건을 검사하지만 정규형 번호가 곧 성능 순위는 아니다. 이론적 분해와 실제 제약 집행·조회 비용은 각각 확인한다.

7. 읽기를 빠르게 하려면 무엇을 다시 중복할 것인가

기초 절에서 배운 의도적 비정규화 원칙을 문구점에 적용해 보자. 여기서는 같은 의미의 값을 읽기 편하게 중복하는 반정규화와 비정규화를 같은 뜻으로 사용한다. 주문 당시 단가·배송지 보존은 서로 다른 시간 사실이므로 그 자체가 반정규화는 아니다.

최근 주문 목록에서 항목합계를 매번 계산하는 비용이 실제 부하시험의 병목이라고 확인되었다고 가정하자. 주문별 요약금액을 저장하면 조회 시 계산을 줄일 수 있다. 하지만 작성중 항목 추가·수량 변경과 확정·취소의 상태 변경 때 어느 금액을 반영하는지, 늦게 갱신되어도 되는지, 잘못된 금액을 어떻게 찾고 다시 만드는지를 함께 정해야 한다.

판단사례의 확인사항
필요의 근거동일한 조회·동시성·데이터량에서 실제 병목 측정
원천 소유확정단가·수량의 원천은 주문항목
갱신 책임확정·변경·취소 시 요약 반영 경로와 처리단위
허용 지연결제와 목록 표시의 일관성 요구가 같은지 확인
검증·복구원천 항목 합계와 대조, 차이 탐지·재계산
재측정읽기 이득과 쓰기·저장·복구 비용을 함께 비교

이 가정은 요약 저장이 항상 빠르거나 반드시 필요하다는 결론이 아니다. 먼저 논리적 사실의 정확성을 세우고 물리 설계에서 인덱스·조회 방식 등을 포함한 대안을 측정한다. 불명확한 요구나 종속 오류를 성능 최적화라는 이름으로 남기지 않는다.

모델 검토를 일곱 질문으로 끝까지 연결한다

  1. 의미: 각 기록의 대상·시점·단위와 입력 근거가 요구사항 사전과 같은가.
  2. 관계: 양방향의 최소·최대 수와 상태별 조건을 빠짐없이 표시했는가.
  3. 식별: 모든 후보키·필수 여부·참조와 동일상품 여러 줄 규칙이 유지되는가.
  4. 종속: 표본이 아니라 업무 규칙으로 FD를 확인하고 폐쇄·최소성으로 키를 검증했는가.
  5. 분해: 반복·이상을 줄인 뒤 원래 사실의 무손실성과 원래 종속의 보존을 각각 확인했는가.
  6. 집행: 한 행 제약과 여러 행·상태·동시성 규칙에 실제 책임을 배정했는가.
  7. 인계: 요구 ID·모델·반례 결과와 예상량·조회조건을 물리 설계에 넘겼는가.

정규화의 결과만 답안에 쓰면 왜 그 표가 나왔는지 보이지 않는다. 선택한 키·종속 한 줄, 잘못 나눈 반례, 유지해야 하는 과거값을 함께 제시하면 구조와 판단이 연결된다.

설계가 놓친 요구는 제약 위반 또는 잘못된 정상값으로 나타난다

설계 실수드러나는 결과검토 기준
이름을 식별자로 가정동명이인 합쳐짐모든 후보키의 업무 근거
주문·상품만으로 항목 식별같은 상품의 여러 줄을 거절R04와 줄의 단위
비식별이면 선택 관계라고 판단고객 없는 주문 허용기본키 참여와 필수 제약 분리
기본키 한 개만 보고 정규형 판정다른 후보키의 부분 종속을 놓침전체 후보키·비주요 속성
공통 열만 있으면 무손실로 판단없던 거래 조합 생성공통 속성의 결정 능력·반례
BCNF면 모든 규칙이 자동 보존된다고 판단원래 조합별 유일성 위반종속 보존을 별도로 검증
독립·조인 규칙 없는 분해금지된 선호·계약 생성MVD·JD의 실제 업무 근거
현재와 이력을 같은 값으로 동기화과거 매출·배송 사실 변경시점별 사실의 독립

어떤 제약은 잘못된 값을 거절하고, 어떤 설계 오류는 잘못된 값을 정상값처럼 보여 준다. 그래서 오류 메시지가 없었다는 이유만으로 모델이 맞다고 결론 내리지 않고 요구와 반례로 돌아간다.

공식 설계 요구를 답안으로 묶는다

이 절의 학습 범위는 요구를 개념·논리 모델과 정규화·제약의 판단으로 바꾸는 것이다. 업무 사실 → 엔터티·관계 → 키·FD → 정규화·무손실·종속 보존 → 규칙 집행·검증 → 물리 인계의 연결을 설명한다. 물리 저장·접근 선택은 다음 절에 연결한다.

정의와 도식에 실제 주문·항목의 키를 넣고, 현재주소와 배송지의 차이로 의미를 판단한다. 분해에서는 존재하지 않던 조합이 생기는 반례와 보존하지 못한 규칙을 쓰며, 고급 정규형은 어떤 종속을 추가로 검사하는지 비교한다. 무손실 하나를 잘 설명한 부분 문제만으로 전체 설계를 모두 다뤘다고 보지 않는다.

8. 시험 논점을 실제 모델과 연결한다

기존 기출 장부에는 개념모델의 관계형 변환, 함수적 종속에서 키 도출, 2NF·3NF·BCNF 비교, 무손실 조인, 4NF·5NF, 정규화와 반정규화가 관련 후보로 남아 있다. 예를 들어 95회 2교시 1번은 무손실 조인, 124회 1교시 8번은 5정규형, 136회 1교시 4번은 4정규형과 관련된다. 이는 관련 논점 후보이지 원문·범위·현행성의 사람 승인이 아니다.

기출의 긴 표나 그림은 전재하지 않는다. 아래 문제·행 데이터·도식은 이 교재가 직접 작성했으며 기출 원문이나 공식 모범답안으로 표시하지 않는다. 분량이 짧은 문제에서는 요구한 판단축을 먼저 답하고, 설계형에서는 전체 연결과 선택 근거를 보여 준다.

10점: 무손실과 종속 보존은 같은 말인가

무손실 분해와 종속 보존의 의미·차이를 설명하고, 손실 분해의 반례와 두 표 분해의 판단 조건을 제시하시오.

두 용어의 정의를 각각 쓰고 복원 가능과 원래 규칙의 검사 가능을 나눠야 한다. 단순히 표를 다시 합칠 수 있다는 말만으로는 원래 없던 행이 생기는 실패를 설명할 수 없다.

무손실·종속 보존 풀이 보기

10점 목차

  1. 무손실 분해의 정의와 관계 이론의 전제
  2. 원래 두 행이 네 행이 되는 손실 반례
  3. 공통 속성이 한쪽 전체를 결정하는 두 표 조건
  4. 종속 보존의 정의와 무손실과의 차이
  5. 업무 제약·모든 허용 상태를 기준으로 검증

10점 도식

본문의 원래 두 행인데 잘못 나누면 네 행이 된다 예제를 다시 대조한다. (O1,C1,P1), (O2,C1,P2)를 주문-고객과 고객-상품으로 나눈 뒤 C1로 조인하면 네 조합이 나오며 O1-P2와 O2-P1이 잘못 추가된다.

별도로 확인할 성질판단 질문
무손실원래 사실만 복원되는가?
종속 보존나눈 표의 규칙들로 원래 규칙을 지키는가?

10점 모범답안

무손실 분해는 주어진 제약을 만족하는 모든 원래 관계를 분해한 표의 조인으로 정확히 복원하는 분해다. 빈값이 없는 관계의 집합 의미에서 투영·자연조인을 판정하며 SQL의 중복·빈값 동작과 동일시하지 않는다.

원래 (O1,C1,P1), (O2,C1,P2)를 주문고객과 고객상품으로 분해해 C1로 조인하면 O1P2·O2P1이 추가된다. 행은 늘었지만 주문과 상품의 원래 대응정보를 잃었으므로 손실 분해다. 두 표의 공통 속성이 한쪽 표 전체를 함수적으로 결정하면 무손실이며, 함수적 종속만을 제약으로 삼을 때 이 조건은 필요충분하다.

종속 보존은 분해된 각 표의 종속을 함께 지키는 것으로 원래 종속들을 보장하는 성질이다. 주문고객·주문주소 분해는 공통 주문번호로 무손실일 수 있지만 고객번호→현재주소를 개별 표의 규칙만으로 보장하지 못한다. 따라서 무손실과 종속 보존을 별도로 확인하고, 공통 열의 존재나 현재 표본 한 번의 성공이 아니라 업무 제약과 모든 허용 상태를 기준으로 검증한다.

25점: 요구에서 검증 가능한 논리 모델까지

고객·상품·주문을 관리하는 문구점의 개념·논리 데이터 모델을 설계하고, 키·함수적 종속·정규화, 무손실·종속 보존과 반정규화의 판단 기준을 제시하시오. 같은 상품의 복수 주문 줄과 과거 단가·배송지 보존을 허용해야 한다.

표 네 개만 나열하지 않는다. 요구가 관계 수·키·속성의 소유 위치를 바꾸는 이유와 분해의 정확성, 실제 제약의 책임까지 설명해야 한다.

통합 모델 설계 풀이 보기

25점 목차

  1. 데이터 모델링의 정의·수준과 요구의 사실 단위
  2. 고객·상품·주문·항목의 엔터티와 최소·최대 관계
  3. 네 표·후보키·식별 관계·필수 외래키
  4. 업무 FD·폐쇄·키 최소성과 1NF·2NF·3NF 적용
  5. 무손실·종속 보존과 BCNF 선택의 경계
  6. 행·참조·집계·상태 규칙의 집행과 반례검증
  7. 이력 보존·반정규화 구별과 물리 설계 인계
  8. 업무 사실에서 모델·종속·분해·집행·검증으로 이어지는 전체 설계

25점 도식

본문의 주문항목이 거래의 줄을 식별한다 관계도와 네 표의 스키마를 함께 읽는다.

키 요약연결·보존할 사실
고객[고객번호]주문[주문번호; 고객번호]가 고객을 참조한다.
상품[상품번호]주문항목[주문번호+항목번호; 상품번호]가 상품과 주문을 참조한다.
주문항목의 복합키동일상품 여러 줄을 허용하며 확정단가·수량을 남긴다.

요구에서 관계·키를 정하고 FD·정규화, 무손실/종속 보존, 규칙 집행까지 검토한다. 현재주소/현재가격과 주문배송지/확정단가는 서로 다른 사실이므로 과거값 유지도 검증한다.

대괄호 첫 항목은 기본키, 세미콜론 뒤는 주요 외래키를 뜻한다. 항목의 복합키를 명시하여 동일상품 여러 줄을 허용한다.

25점 모범답안

데이터 모델링은 업무규칙을 대상·속성·관계·제약으로 표현하여 개념·논리·물리 구조로 구체화하는 과정이다. 개념에서는 업무 의미, 논리에서는 표·키·종속·제약을 결정하고 특정 DBMS의 저장·접근 선택은 물리 설계로 넘긴다. 문구점은 고객·상품·주문·주문항목을 각각 독립적인 사실 단위로 구분한다.

고객과 상품은 주문이 없어도 등록되며 고객 한 명은 0건 이상 주문할 수 있고 주문 한 건의 고객은 정확히 하나다. 작성중 주문의 항목은 0개일 수 있지만 확정 시에는 하나 이상이어야 한다. 항목의 상품과 주문은 각각 필수다. 최대 관계 수뿐 아니라 최소 수와 상태별 규칙을 명시한다.

고객·상품·주문의 기본키는 각각 고객번호·상품번호·주문번호로 잡고 주문에 고객번호 외래키를 둔다. 주문항목은 (주문번호, 항목번호)를 기본키로 하여 주문·상품을 참조한다. 같은 상품이 여러 줄에 들어갈 수 있으므로 주문·상품 조합으로 유일성을 제한하지 않는다. 주문과 항목은 부모키가 자식 기본키에 포함되는 식별 관계이며 고객과 주문은 비식별이지만 고객 연결은 필수다. 대리키를 추가해도 업무 후보키의 유일성은 별도로 유지한다.

업무 FD는 주문번호→고객·주문일·배송지·상태, 주문번호·항목번호→상품·확정단가·수량, 상품번호→상품명·현재가격으로 정한다. 상품번호→확정단가는 서로 다른 주문의 가격 반례로 부정한다. 폐쇄가 전체 속성에 도달하는지와 속성을 뺐을 때 실패하는지를 통해 키의 충분성·최소성을 확인한다. 반복 목록을 줄별 행으로, 주문번호만의 사실을 주문으로, 고객·상품의 현재 사실을 해당 표로 분리하여 1NF·2NF·3NF를 적용한다. 기본키 하나가 아니라 모든 후보키와 비주요 속성을 기준으로 검사한다.

주문·항목 분해는 공통 주문번호가 주문 전체를 결정하므로 무손실이다. 나눈 표의 종속으로 원래 규칙을 보장하는 종속 보존은 별도로 검사한다. BCNF는 모든 비자명 FD의 왼쪽이 슈퍼키인지 묻지만 무손실 BCNF 분해가 종속까지 항상 보존하지는 않는다. 남은 중복과 조합 규칙 검사 비용을 비교해 선택 근거를 남긴다.

값·필수·유일성·외래키는 각 제약에 배정하고, 확정 주문의 최소 항목 수와 합계·상태전환은 여러 행 및 동시 변경을 고려한 처리 책임을 둔다. R06의 취소사유는 주문에 별도로 저장하며 취소 상태에서는 필수다. 상태와 사유를 함께 기록하고 원래 배송지·확정단가·수량을 보존한다. 수량 0, 동명이인, 같은 상품 두 줄, 빈 주문 확정, 사유 없는 취소, 취소→확정 직접전환과 잘못된 조인 조합을 반례로 검증한다. 고객주소·현재가격 변경 뒤 O101의 배송지 A와 금액 23,000원이 유지되는지도 확인한다.

주문 당시 단가·배송지는 현재값과 다른 사실이므로 그 보존 자체를 반정규화로 보지 않는다. 조회용 요약금액은 같은 의미를 중복하는 최적화이므로 실제 병목을 측정한 뒤 원천·갱신 경로·허용 지연·대조·재계산 책임을 정한다. 요구 ID·모델·검증결과와 예상 건수·조회조건을 물리 설계에 인계한다.

설계 전체는 요구의 사실·시점·규칙을 엔터티와 양방향 관계로 표현하고, 모든 후보키·FD를 논리 표와 제약으로 구체화하는 과정이다. 정규화로 사실의 중복을 정리한 뒤 무손실·종속 보존을 검증하고, 여러 행·상태·동시성 규칙의 집행 책임과 반례 결과까지 연결한다. 이 전체 연결을 유지해야 부분 정규화나 도식 하나를 넘어서 요구에 충실한 논리 모델이 된다.

10점: 4NF와 5NF는 왜 따로 필요한가

4정규형과 5정규형을 다치 종속·조인 종속의 관점에서 비교하고, 적용 사례와 잘못된 분해를 막는 판단 기준을 설명하시오.

독립인 여러 값과 여러 관계의 결합 제약을 나눠 설명한다. 여러 값이면 분해, 삼자 관계면 세 쌍으로 분해 같은 무조건 규칙 대신 업무상 독립·조인 조건을 확인해야 한다.

4NF·5NF 비교 풀이 보기

10점 목차

  1. 다치 종속과 4NF의 비자명 종속·슈퍼키 조건
  2. 독립인 연락수단·관심분류의 분해와 반례
  3. 조인 종속과 후보키 제약에 근거한 5NF
  4. 삼자 구매가능 정책의 세 관계 복원과 금지 조합
  5. 실제 업무 제약·무손실 검증과 적용 한계

10점 도식

정규형조합의 뜻분해·복원의 조건
4NF고객의 연락수단 집합 × 관심분류 집합두 집합이 독립이면 고객연락 / 고객관심으로 분리한다.
5NF구매가능(고객,상품,매장)세 쌍의 허용 ⇔ 삼자 허용일 때만 고객상품 ⋈ 고객매장 ⋈ 상품매장으로 정확히 복원한다.

기호 ⋈는 앞에서 설명한 자연조인을 뜻한다. 화살표 조건이 없는 실제 계약을 같은 방식으로 분해하면 금지 조합이 생길 수 있다.

10점 모범답안

다치 종속 X→→Y는 같은 X에 대한 Y값이 나머지 속성과 독립적으로 조합되어야 하는 제약이며, 4NF는 모든 비자명 다치 종속의 왼쪽이 슈퍼키일 것을 요구한다. 고객의 연락수단 두 개와 관심분류 두 개가 독립이면 네 조합을 고객연락·고객관심 두 표로 나누고 조인으로 복원할 수 있다. 특정 연락수단을 특정 분류에만 쓰는 실제 짝이 있다면 독립이 아니므로 같은 분해를 적용하지 않는다.

조인 종속은 정해진 여러 투영을 모두 자연조인하면 모든 허용 상태에서 원래 관계가 복원된다는 제약이며, 5NF는 성립하는 모든 조인 종속이 후보키 제약들에서 함의되어야 한다. 고객상품·고객매장·상품매장의 세 허용조건이 삼자 구매가능성을 정확히 정할 때 이를 분리할 수 있다. 그러나 별도 삼자 계약이 C1·P1·M1을 금지해도 세 쌍이 각각 남아 있다면 조인은 금지행을 다시 만든다.

따라서 4NF는 독립적인 값 집합의 반복, 5NF는 더 일반적인 조인 제약을 검사한다. 현재 표본의 모양이 아니라 실제 업무 제약과 무손실 복원을 확인하며 정규형 번호를 성능 보장이나 모든 업무 오류 제거로 해석하지 않는다.

출처와 검토 상태

개념·관계형 설계와 정규화는 교재 저자들이 공개한 Database System Concepts 7판의 설계 강의와 정규화 강의의 정의·조건을 대조했다. 정규화 강의의 PDF 63–64쪽은 3NF 합성·후보키 보완, 76쪽은 4NF 조건을 설명한다. 여러 후보키를 대상으로 한 2NF 조건은 Elmasri·Navathe의 정규화 강의 PDF 43–47쪽, 5NF의 후보키 함의 조건은 Glavic의 2025년 설계 강의 PDF 131쪽, 인쇄 106쪽의 본문을 확인했다. 여기서 PDF 쪽수는 파일의 첫 페이지를 1로 센 위치다.

Fagin의 다치 종속 원논문 소개와 투영·조인 정규형 원논문 소개는 개념의 연구 배경을 확인하는 보조 근거다. 초록만 확인한 원논문에 대해서는 전문 검증이라고 표시하지 않으며, 상세 정의·판정 조건을 초록만으로 뒷받침하지 않는다.

SQL 제약의 제품 사례는 PostgreSQL 18 공식 Constraints 문서를 사용한다. 일반 관계 이론, 특정 제품 동작, 문구점에만 적용되는 업무 계약을 구별했다. 표·행·도식·계산과 반례는 직접 만들었으며 원출처 도식을 옮기지 않았다.

2026-09-05 기준 집필 후보이며 공식 출처의 보존본·정확한 위치·권리와 독립 기술검토·초보 독자 검증은 별도 장부에서 미승인 상태로 관리한다. 자동으로 문장 위치가 연결되었다고 기술 정확성이 사람에게 승인되었다고 말하지 않는다.

30초 정리

요구의 뜻과 시점을 엔터티·관계·키에 옮기고, 업무 종속과 모든 후보키를 기준으로 정규화를 판단한다. 나눈 뒤에는 원래 사실만 복원되는지와 원래 규칙을 지킬 수 있는지를 각각 확인한다. 현재값과 과거 거래값은 다른 사실이며, 읽기용 중복은 측정·갱신·검증 책임이 있는 별도 선택이다.

추가 연습: 항목ID 하나를 기본키로 골랐으면 2NF일까? 빈값이 없고 각 칸이 원자값인 임시 관계 R(항목ID, 주문번호, 항목번호, 고객번호, 수량)을 사용한다. 유효한 함수적 종속은 항목ID → 주문번호·항목번호·고객번호·수량, 주문번호·항목번호 → 항목ID, 주문번호 → 고객번호와 이들로 추론되는 종속뿐이다. 항목ID를 기본키로 선택했다. 모든 후보키와 주요·비주요 속성을 구하고 2NF·3NF 여부를 판단하라. 위반 원인을 없앨 두 표의 열을 제시하고 무손실 근거도 설명하라. 여기의 고객번호는 주문 당시 고객을 나타내며, 원래 문구점의 전체 스키마를 대체하는 문제가 아니다.

추가 연습의 폐쇄·정규형·분해 풀이 보기

항목ID⁺는 첫 규칙으로 다섯 열 전체가 된다. (주문번호, 항목번호)⁺는 둘째 규칙으로 항목ID를 얻고 첫째 규칙을 적용하여 역시 전체가 된다. 주문번호만으로는 고객번호까지만 얻고, 항목번호만으로는 다른 열을 얻지 못하므로 두 후보키는 각각 {항목ID}와 {주문번호, 항목번호}다. 항목ID가 없고 주문번호 또는 항목번호 중 하나도 없는 집합은 그 빠진 열과 항목ID를 얻을 규칙이 없으므로 다른 후보키는 없다. 주요 속성은 항목ID·주문번호·항목번호이고 비주요 속성은 고객번호·수량이다.

주문번호 → 고객번호는 비주요 속성이 복합 후보키의 일부에 종속되는 경우이므로 2NF를 위반한다. 같은 규칙의 왼쪽은 슈퍼키가 아니고 오른쪽은 주요 속성이 아니므로 3NF도 위반한다. 선택한 기본키가 단일 열이라는 사실만으로 다른 후보키를 검사에서 빼면 안 된다.

주문고객(주문번호, 고객번호)과 항목(항목ID, 주문번호, 항목번호, 수량)으로 나눈다. 공통 주문번호가 주문고객 전체를 결정하므로 함수적 종속의 조건에서 무손실이다. 주문고객은 주문번호를, 항목은 항목ID와 (주문번호, 항목번호)를 각각 후보키로 가지며 부분 종속의 원인은 제거된다. 원래의 항목ID·주문 줄 종속은 항목에서, 주문번호→고객번호는 주문고객에서 검사하고 나머지는 추론할 수 있어 종속도 보존된다. 상품번호가 아닌 주문 안의 줄 번호를 사용하므로 동일상품 여러 줄 허용 규칙을 지우는 분해도 아니다.

이 페이지 목차

이 페이지 목차

1. 표가 깔끔한데 지난 주문이 틀린 이유먼저 되찾을 세 문장업무 계약을 대상·관계·제약으로 바꾼다같은 요구를 잃지 않고 세 번 구체화한다2. 명사를 찾은 뒤에는 한 건의 뜻을 묻는다네 대상과 두 숫자를 구별한다관계의 양 끝에는 최소와 최대가 있다작성중과 확정 상태의 최소 수가 다르다업무 의미로 읽는 개념 모델3. 관계를 표와 키로 옮긴다최대 수와 최소 수를 서로 다른 제약으로 옮긴다현재정보와 주문시점 사실을 보존하는 네 표값이 같아도 갱신되는 곳은 다르다한 열의 제약과 여러 행의 규칙을 구분한다4. 값이 무엇에 달려 있는지 화살표로 본다화살표를 끝까지 따라가면 키인지 확인할 수 있다폐쇄 계산을 네 단계로 읽는다화살표 추론의 세 가지 안전한 규칙한 표의 반복은 서로 다른 세 실패를 만든다1정규형부터 3정규형까지 실제로 나누는 이유기본키 하나의 생김새만으로 정규형을 판정하지 않는다5. 나눈 표를 합쳤을 때 원래 사실만 돌아와야 한다원래 두 행인데 잘못 나누면 네 행이 된다공통 속성이 한쪽 표를 결정하면 안전하게 붙는다잘 복원되어도 규칙을 따로 검사하기 어려울 수 있다6. 더 높은 정규형이 다루는 추가 중복모든 열이 주요 속성이어도 반복은 남을 수 있다무손실과 규칙 보존 중 무엇을 확인하는 절차인가서로 독립인 여러 값의 조합이 반복될 때2개와 2개를 4행으로 곱해서 적을 필요가 있는가두 묶음으로는 드러나지 않는 조합 규칙도 있다세 쌍이 모두 맞아야 허용되는 경우와 별도 계약인 경우높은 정규형은 서로 다른 종류의 반복을 검사한다7. 읽기를 빠르게 하려면 무엇을 다시 중복할 것인가모델 검토를 일곱 질문으로 끝까지 연결한다설계가 놓친 요구는 제약 위반 또는 잘못된 정상값으로 나타난다공식 설계 요구를 답안으로 묶는다8. 시험 논점을 실제 모델과 연결한다10점: 무손실과 종속 보존은 같은 말인가10점 목차10점 도식10점 모범답안25점: 요구에서 검증 가능한 논리 모델까지25점 목차25점 도식25점 모범답안10점: 4NF와 5NF는 왜 따로 필요한가10점 목차10점 도식10점 모범답안출처와 검토 상태30초 정리