본문 바로가기
Infra & Security Eng/Database Engineering

정규화의 근본 목적, 영수증 단계별 정규화 과정, PK와 FK의 기계적 원리, 까치발, 세로선, 동그라미 기호 의미

by 엔지니어 E 2026. 3. 24.
반응형

 

정규화의 근본 목적: 왜 자식이 빠져나와야 하는가?

처음에 영수증 한 장을 표 하나에 다 넣으면, 같은 물건을 살 때마다 품명, 단가, 공급자 주소를 수백 번 반복해서 적어야 한다

중복제거: 똑같은 글자를 여러 번 적지 않기 위해 데이터를 쪼갠다
수정 용이: 상품 가격이 올랐을 때, 수천 장의 영수증을 고치는 대신 [상품] 상자의 단가 하나만 고치면 모두 해결된다

 

단계별 정규화 과정




1단계: 제 1정규화 - 반복 그룹 분리 
내용: 영수증 하단에 여러 줄로 나열되는 품목들(수량, 금액)을 별도의 상자로 뺀다
결과: [영수중 상세] 상자가 생성 된다 
핵심: 한 칸에 하나의 값만 들어가게 만드는 과정이다 


2단계: 제2정규화 - 부분 함수 종속 제거
내용: 상세 내역 중, 상품번호에만 딱 붙어 있는 정보(품명, 단가)를 따로 뺀다
결과: [상품] 상자가 생성 된다 

핵심: PK 전체가 아니라 일부분에만 의존하는 속성을 독립시키는 과정이다


3단계: 제3정규화 - 이행 함수 종속 제거 
* 주인(PK)이 아닌 일반 데이터끼리 서로 '주인-부하' 관계를 맺고 있으면, 그 부하들을 데리고 나가서 독립시키는 것

[정규화 전 예시]
내용
: 영수증 본문에 있는 상호, 소재지 등은 사실 영수증번호가 아니라 사업자번호를 따라가는 정보이다 이를 따로 뺀다

* 사진에서는 이미 3단계가 거쳐있음
결과: 공급자 상자가 생성 된다 
핵심: 기본키(PK)가 아닌 일반 속성끼리 서로 의존하는 관계를 끊는 과정이다

 

PK와 FK의 기계적 원리

PK (Primary Key, 기본키)
정의: 상자 안에서 데이터를 식별할 수 있는 유일한 '번호표'
특징: 중복될 수 없고, 비어있을 수 없음 예: 영수증번호, 상품번호)

FK (Foreign Key, 외래키)
정의: 다른 상자(부모)의 정보를 빌려오기 위해 가져온 '연결 고리
왜 FK인가?: 영수증 상세에 상품명을 직접 적지 않고 상품번호만 적어두는 이유는, 그 번호를 타고 [상품] 상자에 가서 진짜 이름을 확인하기 위함이다. 그래서 '외부에서 온 키'인 FK가 된다

 

PK 선정 원리 

정의: 상자(테이블) 내의 모든 데이터를 서로 중복 없이 식별할 수 있는 유일한 값
선정 이유: 데이터베이스는 특정 데이터를 찾을 때 '이름'이나 '주소'처럼 변할 수 있는 값이 아니라, 절대로 겹치지 않는 고유 번호가 필요하기 때문
적용: 영수증번호, 상품번호, 사업자등록번호 등이 각 상자의 PK가 됨

 

FK 생성 원리

정의: 부모 상자의 PK를 자식 상자로 가져와서 기록한 값
생성 이유: 데이터를 쪼개서 저장했기 때문에, 나중에 이 데이터들이 서로 어떤 관계인지 연결 고리를 남겨야 하기 때문
작성 위치: 부모의 PK가 자식 쪽으로 복사되어 들어오며, 이때 (FK)라고 표시함

 

실선과 점선의 결정적 차이 

위의 사진에서 상자 마다 연결되어 있는 선을 말한다

실선 (Identifying, 식별 관계)
언제 쓰는가?: 부모가 없으면 자식이 아예 태어날 수 없을 때.
예시: 영수증과 영수증 상세. (영수증 번호가 없으면 상세 내역은 종이 쪼가리일 뿐임)
결과: 부모의 PK가 자식의 **PK 영역(실선 위)**으로 들어간다

점선 (Non-Identifying, 비식별 관계)
언제 쓰는가?: 부모 정보를 빌려오긴 하지만, 자식이 독자적인 번호표(PK)를 가질 때

예시: 공급자와 영수증. (공급자 정보가 없어도 영수증은 번호표만 있으면 일단 영수증임)
결과: 부모의 PK가 자식의 **일반 영역(실선 아래)**으로 들어간다

 

까마귀 발 (∈) 기호의 원리

의미: 다(Many) 관계를 뜻함
사용 이유: 부모 데이터 1개에 대해 자식 데이터가 여러 개 존재할 수 있음을 표시하기 위함
적용:
한 명의 **[공급자]**는 여러 장의 **[영수증]**을 발행할 수 있으므로 [영수증] 쪽에 표시
한 장의 **[영수증]**에는 여러 개의 **[상품]**이 담기므로 [영수증 상세] 쪽에 표시
하나의 **[상품]**은 여러 장의 영수증에 나타날 수 있으므로 [영수증 상세] 쪽에 표시
(예: '아메리카노'라는 상품 하나가 오늘 팔린 100장의 영수증 상세 내역에 각각 기록될 수 있음) 

 

동그라미 (o) 기호의 원리

의미: 선택적(Optional, 0) 관계를 뜻함
사용 이유: 부모 데이터는 존재하지만, 그와 연결된 자식 데이터가 아직 하나도 없을 수도 있음을 명시하기 위함
적용:
신규 상품을 등록했지만 아직 한 번도 팔리지 않아 영수증 상세 데이터가 0개인 상황을 허용하기 위해 영수증 상세 쪽에 표시함

 

세로선 (|) 기호의 원리(부모쪽)

의미: 1(Mandatory) 관계를 뜻함
사용 이유: 자식 데이터가 존재하려면 반드시 근거가 되는 부모 데이터가 1개 존재해야 함을 강제함
적용: 
**[영수증 상세]**에 적힌 '상품번호'는 반드시 [상품] 상자에 실제로 등록되어 있는 번호여야만 한다. 근거 없는 상품번호를 상세 내역에 적는 것을 차단하기 위해 부모 쪽에 세로선을 긋는다

 

* 실제 공급자 입장에서 "상품"보다는 "자재"라고 표혐함