정규화: 두 판 사이의 차이

기술노트
(Gemini 벌크 업로더로 자동 업로드)
 
(Gemini 벌크 업로더로 자동 업로드)
 
1번째 줄: 1번째 줄:
== 🗃️ 데이터베이스 정규화 (Database Normalization) ==
== 데이터베이스 정규화 (Database Normalization) ==


'''정규화'''는 관계형 데이터베이스(RDBMS)에서 '''데이터의 중복을 최소화하고 데이터의 일관성을 보장'''하기 위해, 테이블을 특정 규칙에 따라 분리하고 재구성하는 과정입니다. 데이터베이스를 보다 '''체계적이고 효율적으로''' 설계하기 위한 방법론입니다.
'''데이터베이스 정규화(Normalization)'''란, 관계형 데이터베이스에서 데이터의 중복을 최소화하고 데이터의 일관성을 확보하기 위해, 테이블을 특정 규칙에 따라 재구성하고 분해하는 과정입니다. 정규화를 통해 데이터 구조를 더 효율적으로 만들어 '''데이터 이상 현상(Anomaly)'''을 방지할 수 있습니다.
 
정규화를 통해 데이터 삽입, 수정, 삭제 시 발생할 수 있는 '이상 현상(Anomaly)'을 방지할 수 있습니다.


----
----


=== 🧐 정규화의 목표와 이상 현상 ===
=== 🔍 정규화가 필요한 이유: 데이터 이상 현상 (Anomaly) ===


* '''삽입 이상 (Insertion Anomaly)''' : 불필요한 데이터 없이는 새로운 데이터를 추가할 없는 현상.
정규화되지 않은 테이블에서는 데이터를 추가, 수정, 삭제할 때 다음과 같은 문제가 발생할 있습니다.
* '''갱신 이상 (Update Anomaly)''' : 중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생하는 현상.
* '''삭제 이상 (Deletion Anomaly)''' : 특정 정보를 삭제하면, 원치 않는 다른 정보까지 함께 삭제되는 현상.


정규화는 이러한 이상 현상을 해결하여 데이터 무결성을 유지하는 것을 목표로 합니다.
* '''삽입 이상 (Insertion Anomaly)''' : 불필요한 데이터 없이는 어떤 데이터를 삽입할 수 없는 현상입니다. (예: 아직 수강신청을 하지 않은 신입생의 정보를, 수강 정보와 학생 정보가 합쳐진 테이블에 삽입할 수 없음)
* '''갱신 이상 (Update Anomaly)''' : 중복된 데이터 중 일부만 수정되어 데이터의 일관성이 깨지는 현상입니다. (예: 한 학생의 주소가 여러 행에 걸쳐 저장되어 있을 때, 일부만 수정하여 주소가 여러 개가 됨)
* '''삭제 이상 (Deletion Anomaly)''' : 어떤 정보를 삭제하면, 의도치 않은 다른 정보까지 함께 삭제되는 현상입니다. (예: 한 학생이 마지막 수강 과목을 취소했더니, 그 학생의 정보 자체가 테이블에서 사라짐)


----
----


=== 📚 정규형의 종류 ===
=== 📈 정규화 과정 (Normal Forms) ===
 
* '''제1정규형 (1NF)'''
> * '조건': 테이블의 모든 컬럼 값이 '''원자적 값(Atomic Value)'''을 가져야 합니다. (하나의 컬럼에 여러 값이 들어갈 수 없음)
 
* '''제2정규형 (2NF)'''
> * '조건': 제1정규형을 만족하고, '''부분 함수 종속(Partial Functional Dependency)'''을 제거해야 합니다. 즉, 기본 키의 일부에만 종속되는 컬럼이 없어야 합니다.
> * '설명': 기본 키가 여러 컬럼으로 구성된 '복합 키'일 경우에만 해당되며, 기본 키의 일부에만 종속되는 컬럼을 별도의 테이블로 분리합니다.


정규화는 여러 단계(정규형)로 나뉘며, 일반적으로 제3정규형까지 만족시키는 것을 목표로 합니다.
* '''제3정규형 (3NF)'''
> * '조건': 제2정규형을 만족하고, '''이행 함수 종속(Transitive Functional Dependency)'''을 제거해야 합니다. 즉, 기본 키가 아닌 컬럼이 다른 일반 컬럼을 결정해서는 안 됩니다.
> * '설명': A→B 이고 B→C 일 때, A→C 가 성립하는 종속 관계(A: 기본키, B,C: 일반컬럼)를 제거합니다. (예: 학생ID→학과명, 학과명→학과전화번호 관계에서, 학과 정보를 별도 테이블로 분리)


* '''제1정규형 (1NF)''' : 테이블의 모든 컬럼 값이 '''원자 값(Atomic Value)'''을 갖도록 분해합니다. (하나의 컬럼에 여러 값이 들어가지 않도록 함)
* '''BCNF (Boyce-Codd Normal Form)'''
* '''제2정규형 (2NF)''' : 제1정규형을 만족하고, '''부분 함수 종속성'''을 제거합니다. (기본 키의 일부에만 종속되는 컬럼을 별도 테이블로 분리)
> * '조건': 제3정규형을 만족하고, 모든 결정자(Determinant)가 후보 키(Candidate Key)여야 합니다. 3NF보다 더 엄격한 정규형입니다.
* '''제3정규형 (3NF)''' : 제2정규형을 만족하고, '''이행 함수 종속성'''을 제거합니다. (기본 키가 아닌 다른 일반 컬럼에 종속되는 컬럼을 분리)
* '''BCNF (Boyce-Codd Normal Form)''' : 제3정규형보다 더 엄격한 조건으로, 모든 결정자가 후보 키가 되도록 합니다.


----
----
30번째 줄: 35번째 줄:
=== 💡 개발자 핵심 Point ===
=== 💡 개발자 핵심 Point ===


* 정규화는 데이터 중복을 줄여 저장 공간을 효율적으로 사용하고, 데이터 일관성을 유지하는 데 필수적입니다.
* 정규화의 핵심 목표는 '''데이터의 중복 최소화'''와 '''데이터 일관성 확보'''입니다.
* 하지만 과도한 정규화는 테이블이 너무 많이 분리되어, 데이터 조회 시 '''JOIN 연산이 많아져 성능이 저하'''수 있습니다.
* 실무에서는 보통 '''제3정규형(3NF)'''까지 만족시키는 것을 목표로 데이터베이스를 설계합니다.
* 따라서 실제 시스템 설계 시에는 정규화를 통해 데이터 무결성을 확보하고, 필요에 따라 '''반정규화(Denormalization)'''를 적용하여 성능을 최적화하는 균형점을 찾아야 합니다.
* 과도한 정규화는 테이블 간의 `JOIN` 연산을 너무 많이 필요로 하여 오히려 조회 성능 저하를 유발할 수 있습니다.
* 따라서, 조회 성능이 매우 중요한 경우에는 중복을 감수하고 의도적으로 정규화를 위배하는 '''반정규화(Denormalization)'''를 수행하기도 합니다.
* 정규화와 반정규화는 트레이드오프(Trade-off) 관계로, 데이터의 '일관성'과 '성능' 사이에서 서비스의 특징을 고려하여 적절한 균형을 맞추는 설계가 중요합니다.

2025년 9월 11일 (목) 16:50 기준 최신판

데이터베이스 정규화 (Database Normalization)

데이터베이스 정규화(Normalization)란, 관계형 데이터베이스에서 데이터의 중복을 최소화하고 데이터의 일관성을 확보하기 위해, 테이블을 특정 규칙에 따라 재구성하고 분해하는 과정입니다. 정규화를 통해 데이터 구조를 더 효율적으로 만들어 데이터 이상 현상(Anomaly)을 방지할 수 있습니다.


🔍 정규화가 필요한 이유: 데이터 이상 현상 (Anomaly)

정규화되지 않은 테이블에서는 데이터를 추가, 수정, 삭제할 때 다음과 같은 문제가 발생할 수 있습니다.

  • 삽입 이상 (Insertion Anomaly) : 불필요한 데이터 없이는 어떤 데이터를 삽입할 수 없는 현상입니다. (예: 아직 수강신청을 하지 않은 신입생의 정보를, 수강 정보와 학생 정보가 합쳐진 테이블에 삽입할 수 없음)
  • 갱신 이상 (Update Anomaly) : 중복된 데이터 중 일부만 수정되어 데이터의 일관성이 깨지는 현상입니다. (예: 한 학생의 주소가 여러 행에 걸쳐 저장되어 있을 때, 일부만 수정하여 주소가 여러 개가 됨)
  • 삭제 이상 (Deletion Anomaly) : 어떤 정보를 삭제하면, 의도치 않은 다른 정보까지 함께 삭제되는 현상입니다. (예: 한 학생이 마지막 수강 과목을 취소했더니, 그 학생의 정보 자체가 테이블에서 사라짐)

📈 정규화 과정 (Normal Forms)

  • 제1정규형 (1NF)

> * '조건': 테이블의 모든 컬럼 값이 원자적 값(Atomic Value)을 가져야 합니다. (하나의 컬럼에 여러 값이 들어갈 수 없음)

  • 제2정규형 (2NF)

> * '조건': 제1정규형을 만족하고, 부분 함수 종속(Partial Functional Dependency)을 제거해야 합니다. 즉, 기본 키의 일부에만 종속되는 컬럼이 없어야 합니다. > * '설명': 기본 키가 여러 컬럼으로 구성된 '복합 키'일 경우에만 해당되며, 기본 키의 일부에만 종속되는 컬럼을 별도의 테이블로 분리합니다.

  • 제3정규형 (3NF)

> * '조건': 제2정규형을 만족하고, 이행 함수 종속(Transitive Functional Dependency)을 제거해야 합니다. 즉, 기본 키가 아닌 컬럼이 다른 일반 컬럼을 결정해서는 안 됩니다. > * '설명': A→B 이고 B→C 일 때, A→C 가 성립하는 종속 관계(A: 기본키, B,C: 일반컬럼)를 제거합니다. (예: 학생ID→학과명, 학과명→학과전화번호 관계에서, 학과 정보를 별도 테이블로 분리)

  • BCNF (Boyce-Codd Normal Form)

> * '조건': 제3정규형을 만족하고, 모든 결정자(Determinant)가 후보 키(Candidate Key)여야 합니다. 3NF보다 더 엄격한 정규형입니다.


💡 개발자 핵심 Point

  • 정규화의 핵심 목표는 데이터의 중복 최소화데이터 일관성 확보입니다.
  • 실무에서는 보통 제3정규형(3NF)까지 만족시키는 것을 목표로 데이터베이스를 설계합니다.
  • 과도한 정규화는 테이블 간의 `JOIN` 연산을 너무 많이 필요로 하여 오히려 조회 성능 저하를 유발할 수 있습니다.
  • 따라서, 조회 성능이 매우 중요한 경우에는 중복을 감수하고 의도적으로 정규화를 위배하는 반정규화(Denormalization)를 수행하기도 합니다.
  • 정규화와 반정규화는 트레이드오프(Trade-off) 관계로, 데이터의 '일관성'과 '성능' 사이에서 서비스의 특징을 고려하여 적절한 균형을 맞추는 설계가 중요합니다.