Sam Baek, The Dev's Corner

🎯 λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”μ˜ λͺ¨λ“  것

30 Oct 2025

λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”λž€ 무엇인가


λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ„€κ³„ν•˜λ‹€ 보면 μ’…μ’… λ‚œκ°ν•œ 상황에 λ§ˆμ£Όν•˜κ³€ ν•œλ‹€.
같은 정보가 μ—¬λŸ¬ 곳에 μ€‘λ³΅λ˜μ–΄ μ €μž₯λ˜κ±°λ‚˜,
ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— λ„ˆλ¬΄ λ§Žμ€ 정보가 λ‹΄κ²¨μžˆμ–΄ κ΄€λ¦¬ν•˜κΈ° μ–΄λ €μš΄ 경우 말이닀.

μ΄λŠ” 마치 책상 μ„œλžμ„ μ •λ¦¬ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•˜λŠ” 것과 λΉ„μŠ·ν•˜λ‹€.
μ²˜μŒμ—” νŽΈν• μ§€ λͺ°λΌλ„, μ‹œκ°„μ΄ μ§€λ‚ μˆ˜λ‘
같은 물건이 μ—¬λŸ¬ μ„œλžμ— ν©μ–΄μ Έμžˆκ³ ,
ν•„μš”ν•œ 물건을 μ°ΎκΈ° μœ„ν•΄ λͺ¨λ“  μ„œλžμ„ λ’€μ Έμ•Ό ν•˜λŠ” 상황이 μ˜¨λ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”(Normalization)λŠ” λ°”λ‘œ 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 체계적인 방법이닀.
λ°μ΄ν„°μ˜ 쀑볡을 μ΅œμ†Œν™”ν•˜κ³ , 데이터 무결성을 μœ μ§€ν•˜λ©°,
효율적인 데이터 관리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 섀계 기법이닀.

μ™œ λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”κ°€ ν•„μš”ν• κΉŒ?


μ •κ·œν™”λ₯Ό ν•˜μ§€ μ•Šμ€ λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ—¬λŸ¬ 문제λ₯Ό μ•ΌκΈ°ν•œλ‹€.

첫째, 쀑볡 이상(Redundancy Anomaly)이 λ°œμƒν•œλ‹€.
같은 정보가 μ—¬λŸ¬ 곳에 μ €μž₯λ˜μ–΄ 있으면 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ
λͺ¨λ“  μœ„μΉ˜λ₯Ό μ°Ύμ•„μ„œ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ”λ°,
ν•˜λ‚˜λΌλ„ λˆ„λ½λ˜λ©΄ 데이터 λΆˆμΌμΉ˜κ°€ λ°œμƒν•œλ‹€.

λ‘˜μ§Έ, μ‚½μž… 이상(Insertion Anomaly)이 λ°œμƒν•œλ‹€.
μƒˆλ‘œμš΄ 데이터λ₯Ό μž…λ ₯ν•  λ•Œ λΆˆν•„μš”ν•œ μ •λ³΄κΉŒμ§€ ν•¨κ»˜ μž…λ ₯ν•΄μ•Ό ν•˜κ±°λ‚˜,
νŠΉμ • 정보 μ—†μ΄λŠ” 데이터λ₯Ό μž…λ ₯ν•  수 μ—†λŠ” 상황이 생긴닀.

μ…‹μ§Έ, μ‚­μ œ 이상(Deletion Anomaly)이 λ°œμƒν•œλ‹€.
μ–΄λ–€ 정보λ₯Ό μ‚­μ œν•  λ•Œ ν•¨κ»˜ λ³΄κ΄€ν•˜κ³  싢은 λ‹€λ₯Έ μ •λ³΄κΉŒμ§€
ν•¨κ»˜ μ‚­μ œλ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

λ„·μ§Έ, κ°±μ‹  이상(Update Anomaly)이 λ°œμƒν•œλ‹€.
데이터λ₯Ό μˆ˜μ •ν•  λ•Œ μΌλΆ€λ§Œ μˆ˜μ •λ˜μ–΄
λ°μ΄ν„°μ˜ 일관성이 κΉ¨μ§€λŠ” κ²½μš°κ°€ 생긴닀.

μ •κ·œν™”μ˜ 단계별 이해


λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”λŠ” μ—¬λŸ¬ λ‹¨κ³„λ‘œ λ‚˜λ‰˜μ–΄μ Έ μžˆλ‹€.
각 단계λ₯Ό μ •κ·œν˜•(Normal Form)이라고 λΆ€λ₯΄λ©°,
제1μ •κ·œν˜•λΆ€ν„° 제5μ •κ·œν˜•κΉŒμ§€ μ‘΄μž¬ν•œλ‹€.
μ‹€λ¬΄μ—μ„œλŠ” 보톡 제3μ •κ·œν˜•κΉŒμ§€ μ μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

제1μ •κ·œν˜• (1NF: First Normal Form)


제1μ •κ·œν˜•μ€ κ°€μž₯ 기본적인 μ •κ·œν™” λ‹¨κ³„λ‘œ,
λͺ¨λ“  속성 값이 μ›μžκ°’(Atomic Value)을 κ°€μ Έμ•Ό ν•œλ‹€λŠ” κ·œμΉ™μ΄λ‹€.

μ‰½κ²Œ 말해, ν•˜λ‚˜μ˜ μΉΈμ—λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ λ“€μ–΄κ°€μ•Ό ν•œλ‹€λŠ” μ˜λ―Έλ‹€.
λ°°μ—΄μ΄λ‚˜ 리슀트 같은 볡합 값은 ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.

μ •κ·œν™” μ „ μ˜ˆμ‹œ:

학생ID 학생이름 μˆ˜κ°•κ³Όλͺ©
1 κΉ€μ² μˆ˜ μˆ˜ν•™, μ˜μ–΄, κ΅­μ–΄
2 이영희 κ³Όν•™, μˆ˜ν•™


제1μ •κ·œν˜• 적용 ν›„:

학생ID 학생이름 μˆ˜κ°•κ³Όλͺ©
1 κΉ€μ² μˆ˜ μˆ˜ν•™
1 κΉ€μ² μˆ˜ μ˜μ–΄
1 κΉ€μ² μˆ˜ κ΅­μ–΄
2 이영희 κ³Όν•™
2 이영희 μˆ˜ν•™


이제 각 μΉΈμ—λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ λ“€μ–΄κ°€κ²Œ λ˜μ—ˆλ‹€.
단, 이 μƒνƒœμ—μ„œλŠ” 학생 정보가 μ€‘λ³΅λ˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

제2μ •κ·œν˜• (2NF: Second Normal Form)


제2μ •κ·œν˜•μ€ 제1μ •κ·œν˜•μ„ λ§Œμ‘±ν•˜λ©΄μ„œ,
λΆ€λΆ„ ν•¨μˆ˜ 쒅속성을 μ œκ±°ν•œ μƒνƒœλ₯Ό μ˜λ―Έν•œλ‹€.

λΆ€λΆ„ ν•¨μˆ˜ μ’…μ†μ„±μ΄λž€ κΈ°λ³Έν‚€μ˜ μΌλΆ€λΆ„μ—λ§Œ μ’…μ†λ˜λŠ” 속성을 λ§ν•œλ‹€.
볡합킀(μ—¬λŸ¬ μ†μ„±μœΌλ‘œ 이루어진 κΈ°λ³Έν‚€)κ°€ μžˆμ„ λ•Œ λ°œμƒν•œλ‹€.

μ •κ·œν™” μ „ μ˜ˆμ‹œ:

학생ID κ³Όλͺ©μ½”λ“œ 학생이름 κ³Όλͺ©μ΄λ¦„ 성적
1 M01 κΉ€μ² μˆ˜ μˆ˜ν•™ A
1 E01 κΉ€μ² μˆ˜ μ˜μ–΄ B
2 M01 이영희 μˆ˜ν•™ A+

κΈ°λ³Έν‚€: (학생ID, κ³Όλͺ©μ½”λ“œ)
문제: 학생이름은 학생IDμ—λ§Œ 쒅속, κ³Όλͺ©μ΄λ¦„은 κ³Όλͺ©μ½”λ“œμ—λ§Œ 쒅속

제2μ •κ·œν˜• 적용 ν›„:

학생 ν…Œμ΄λΈ”:

학생ID 학생이름
1 κΉ€μ² μˆ˜
2 이영희

κ³Όλͺ© ν…Œμ΄λΈ”:

κ³Όλͺ©μ½”λ“œ κ³Όλͺ©μ΄λ¦„
M01 μˆ˜ν•™
E01 μ˜μ–΄

μˆ˜κ°• ν…Œμ΄λΈ”:

학생ID κ³Όλͺ©μ½”λ“œ 성적
1 M01 A
1 E01 B
2 M01 A+


이제 각 정보가 μ μ ˆν•œ ν…Œμ΄λΈ”λ‘œ λΆ„λ¦¬λ˜μ—ˆλ‹€.

제3μ •κ·œν˜• (3NF: Third Normal Form)


제3μ •κ·œν˜•μ€ 제2μ •κ·œν˜•μ„ λ§Œμ‘±ν•˜λ©΄μ„œ,
이행 ν•¨μˆ˜ 쒅속성을 μ œκ±°ν•œ μƒνƒœλ₯Ό μ˜λ―Έν•œλ‹€.

이행 ν•¨μˆ˜ μ’…μ†μ„±μ΄λž€ A β†’ B, B β†’ C일 λ•Œ A β†’ Cκ°€ μ„±λ¦½ν•˜λŠ” 관계λ₯Ό λ§ν•œλ‹€.
즉, κΈ°λ³Έν‚€κ°€ μ•„λ‹Œ 속성이 λ‹€λ₯Έ λΉ„κΈ°λ³Έν‚€ 속성을 κ²°μ •ν•˜λŠ” κ²½μš°λ‹€.

μ •κ·œν™” μ „ μ˜ˆμ‹œ:

학생ID 학생이름 ν•™κ³Όμ½”λ“œ 학과이름 ν•™κ³Όμž₯
1 κΉ€μ² μˆ˜ CS 컴퓨터곡학 λ°•κ΅μˆ˜
2 이영희 EE μ „μžκ³΅ν•™ 졜ꡐ수
3 λ°•λ―Όμˆ˜ CS 컴퓨터곡학 λ°•κ΅μˆ˜

κΈ°λ³Έν‚€: 학생ID
문제: 학생ID β†’ ν•™κ³Όμ½”λ“œ β†’ 학과이름, ν•™κ³Όμž₯ (이행 쒅속)

제3μ •κ·œν˜• 적용 ν›„:

학생 ν…Œμ΄λΈ”:

학생ID 학생이름 ν•™κ³Όμ½”λ“œ
1 κΉ€μ² μˆ˜ CS
2 이영희 EE
3 λ°•λ―Όμˆ˜ CS

ν•™κ³Ό ν…Œμ΄λΈ”:

ν•™κ³Όμ½”λ“œ 학과이름 ν•™κ³Όμž₯
CS 컴퓨터곡학 λ°•κ΅μˆ˜
EE μ „μžκ³΅ν•™ 졜ꡐ수


이제 ν•™κ³Ό 정보가 μ€‘λ³΅λ˜μ§€ μ•Šκ³ ,
ν•™κ³Όμž₯이 λ°”λ€Œμ–΄λ„ ν•œ 곳만 μˆ˜μ •ν•˜λ©΄ λœλ‹€.

μ •κ·œν™”μ˜ μž₯점과 단점


🟒 μ •κ·œν™”μ˜ μž₯점


  1. 데이터 쀑볡 μ΅œμ†Œν™”
    같은 데이터λ₯Ό μ—¬λŸ¬ 곳에 μ €μž₯ν•˜μ§€ μ•Šμ•„ μ €μž₯ 곡간을 μ ˆμ•½ν•  수 μžˆλ‹€.

  2. 데이터 무결성 ν–₯상
    쀑볡이 μ—†μœΌλ―€λ‘œ 데이터 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

  3. 이상 ν˜„μƒ λ°©μ§€
    μ‚½μž…, μ‚­μ œ, κ°±μ‹  μ‹œ λ°œμƒν•  수 μžˆλŠ” 이상 ν˜„μƒμ„ μ˜ˆλ°©ν•  수 μžˆλ‹€.

  4. μœ μ§€λ³΄μˆ˜ 용이
    데이터 ꡬ쑰가 λͺ…ν™•ν•˜μ—¬ μˆ˜μ •μ΄ ν•„μš”ν•  λ•Œ 영ν–₯ λ²”μœ„κ°€ λͺ…ν™•ν•˜λ‹€.

  5. ν™•μž₯μ„± ν–₯상
    μƒˆλ‘œμš΄ 데이터 μΆ”κ°€ μ‹œ κΈ°μ‘΄ ꡬ쑰에 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

πŸ”΄ μ •κ·œν™”μ˜ 단점


  1. 쑰인 μ—°μ‚° 증가
    ν…Œμ΄λΈ”μ΄ λΆ„λ¦¬λ˜λ©΄μ„œ 데이터λ₯Ό μ‘°νšŒν•  λ•Œ μ—¬λŸ¬ ν…Œμ΄λΈ”μ„ 쑰인해야 ν•œλ‹€.

  2. μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯μ„±
    쑰인 연산이 λ§Žμ•„μ§€λ©΄ 쿼리 μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€.

  3. λ³΅μž‘λ„ 증가
    ν…Œμ΄λΈ” μˆ˜κ°€ λ§Žμ•„μ Έ 초기 섀계와 쿼리 μž‘μ„±μ΄ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€.

λ°˜μ •κ·œν™” (Denormalization)


μ •κ·œν™”κ°€ 항상 정닡은 μ•„λ‹ˆλ‹€.
λ•Œλ‘œλŠ” μ˜λ„μ μœΌλ‘œ μ •κ·œν™”λ₯Ό ν’€μ–΄μ•Ό ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.

λ°˜μ •κ·œν™”λŠ” μ„±λŠ₯ ν–₯상을 μœ„ν•΄ μ˜λ„μ μœΌλ‘œ 쀑볡을 ν—ˆμš©ν•˜λŠ” 기법이닀.
특히 쑰회 μ„±λŠ₯이 μ€‘μš”ν•œ μ‹œμŠ€ν…œμ—μ„œ 자주 μ‚¬μš©λœλ‹€.

🏷️ λ°˜μ •κ·œν™”λ₯Ό κ³ λ €ν•΄μ•Ό ν•˜λŠ” 경우


  • 쑰인 연산이 λ„ˆλ¬΄ λ§Žμ•„ μ„±λŠ₯이 μ‹¬κ°ν•˜κ²Œ μ €ν•˜λ˜λŠ” 경우
  • νŠΉμ • ν…Œμ΄λΈ”μ˜ 쑰회 λΉˆλ„κ°€ 맀우 높은 경우
  • ν†΅κ³„λ‚˜ 집계 데이터λ₯Ό 자주 μ‚¬μš©ν•˜λŠ” 경우
  • 이λ ₯ 데이터λ₯Ό λΉ λ₯΄κ²Œ μ‘°νšŒν•΄μ•Ό ν•˜λŠ” 경우

단, λ°˜μ •κ·œν™”λ₯Ό μ μš©ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ λ‹€μŒμ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€:

  1. 데이터 일관성 μœ μ§€ λ°©μ•ˆ 마련
  2. νŠΈλ¦¬κ±°λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직으둜 쀑볡 데이터 동기화
  3. μ„±λŠ₯ κ°œμ„  효과 μΈ‘μ •

μ‹€μ „ μ˜ˆμ‹œ: μ‡Όν•‘λͺ° λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”


μ‹€μ œ μ‡Όν•‘λͺ° λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ •κ·œν™”ν•˜λŠ” 과정을 μ‚΄νŽ΄λ³΄μž.

μ •κ·œν™” μ „:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    customer_phone VARCHAR(20),
    product_name VARCHAR(100),
    product_price DECIMAL(10,2),
    quantity INT,
    order_date DATE
);


이 κ΅¬μ‘°λŠ” μ—¬λŸ¬ λ¬Έμ œκ°€ μžˆλ‹€:

  • 고객 정보 쀑볡
  • μƒν’ˆ 정보 쀑볡
  • ν•œ 주문에 μ—¬λŸ¬ μƒν’ˆμ„ 담을 수 μ—†μŒ

μ •κ·œν™” ν›„ (제3μ •κ·œν˜•):

-- 고객 ν…Œμ΄λΈ”
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(100) NOT NULL,
    customer_email VARCHAR(100) UNIQUE NOT NULL,
    customer_phone VARCHAR(20)
);

-- μƒν’ˆ ν…Œμ΄λΈ”
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(100) NOT NULL,
    product_price DECIMAL(10,2) NOT NULL,
    stock_quantity INT DEFAULT 0
);

-- μ£Όλ¬Έ ν…Œμ΄λΈ”
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(10,2),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- μ£Όλ¬Έ 상세 ν…Œμ΄λΈ”
CREATE TABLE order_details (
    order_detail_id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    unit_price DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);


이제 λ‹€μŒκ³Ό 같은 이점을 얻을 수 μžˆλ‹€:

  • 고객 μ •λ³΄λŠ” ν•œ κ³³μ—μ„œλ§Œ 관리
  • μƒν’ˆ 가격 λ³€κ²½ μ‹œ ν•œ 번만 μˆ˜μ •
  • ν•œ 주문에 μ—¬λŸ¬ μƒν’ˆμ„ 담을 수 있음
  • μ£Όλ¬Έ μ‹œμ μ˜ 가격을 order_details에 μ €μž₯ν•˜μ—¬ 이λ ₯ 관리 κ°€λŠ₯

μ •κ·œν™” 적용 μ‹œ μ£Όμ˜μ‚¬ν•­


  1. κ³Όλ„ν•œ μ •κ·œν™” μ§€μ–‘
    제3μ •κ·œν˜•κΉŒμ§€λ§Œ μ μš©ν•΄λ„ λŒ€λΆ€λΆ„μ˜ 경우 μΆ©λΆ„ν•˜λ‹€.
    무쑰건 높은 μ •κ·œν˜•μ„ μ μš©ν•˜λ©΄ 였히렀 λ³΅μž‘λ„λ§Œ μ¦κ°€ν•œλ‹€.

  2. λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­ μš°μ„ 
    μ„±λŠ₯이 μ€‘μš”ν•œ 곳은 λ°˜μ •κ·œν™”λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.
    이둠적 완벽함보닀 μ‹€μš©μ„±μ΄ μ€‘μš”ν•˜λ‹€.

  3. 인덱슀 ν™œμš©
    μ •κ·œν™”λ‘œ 쑰인이 λ§Žμ•„μ‘Œλ‹€λ©΄ μ μ ˆν•œ 인덱슀λ₯Ό μƒμ„±ν•˜μ—¬
    μ„±λŠ₯ μ €ν•˜λ₯Ό μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€.

  4. λ¬Έμ„œν™”
    μ •κ·œν™” 결과와 ν…Œμ΄λΈ” κ°„ 관계λ₯Ό λͺ…ν™•νžˆ λ¬Έμ„œν™”ν•˜μ—¬
    λ‹€λ₯Έ κ°œλ°œμžλ„ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ ν•œλ‹€.

마무리


λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”λŠ” λ‹¨μˆœνžˆ 이둠적 κ°œλ…μ΄ μ•„λ‹ˆλΌ
μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œ 데이터 ν’ˆμ§ˆκ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ κ²°μ •ν•˜λŠ” μ€‘μš”ν•œ 기법이닀.

처음 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 섀계할 λ•Œ μ •κ·œν™”λ₯Ό κ³ λ €ν•˜λ©΄
λ‚˜μ€‘μ— λ°œμƒν•  수 μžˆλŠ” λ§Žμ€ 문제λ₯Ό μ˜ˆλ°©ν•  수 μžˆλ‹€.
ν•˜μ§€λ§Œ λ§Ήλͺ©μ μœΌλ‘œ μ •κ·œν™”λ§Œ μΆ”κ΅¬ν•˜κΈ°λ³΄λ‹€λŠ”
ν”„λ‘œμ νŠΈμ˜ νŠΉμ„±κ³Ό μš”κ΅¬μ‚¬ν•­μ„ κ³ λ €ν•˜μ—¬
μ μ ˆν•œ μˆ˜μ€€μ˜ μ •κ·œν™”λ₯Ό μ μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

싀무 κ²½ν—˜μ„ μŒ“λ‹€ 보면 μ–Έμ œ μ •κ·œν™”λ₯Ό μ μš©ν•˜κ³ 
μ–Έμ œ λ°˜μ •κ·œν™”λ₯Ό κ³ λ €ν•΄μ•Ό ν•˜λŠ”μ§€ 감각이 생긴닀.
이 글이 κ·Έ μ‹œμž‘μ μ΄ 되길 λ°”λž€λ‹€.