본문 바로가기
프로그래밍/SQL

[SQL] 6. SQL의 "데이터베이스 설계 및 정규화"

by iwbap 2024. 7. 13.
728x90

SQL 학습: 데이터베이스 설계 및 정규화

데이터베이스 설계와 정규화는 데이터베이스의 효율성과 무결성을 유지하는 데 중요한 역할을 합니다. 이번 글에서는 정규화의 개념과 각 정규형에 대해 알아보고, 반정규화의 개념과 필요성에 대해 설명하겠습니다.


6.1 정규화 개념

정규화는 데이터베이스를 설계할 때 중복을 최소화하고 데이터의 일관성과 무결성을 유지하기 위해 데이터베이스를 구조화하는 과정입니다. 정규화는 여러 단계로 이루어지며, 각 단계는 특정 규칙을 만족시켜야 합니다.

 

1. 제1정규형 (1NF)

  • 모든 열의 값이 원자값(더 이상 분해할 수 없는 값)을 가져야 합니다.
  • 각 행이 유일해야 하며, 중복된 행이 없어야 합니다.

예제

 

- 기본 테이블 구조

ID Name Phone Numbers
1 John 123-4567, 234-5678

 

 

- 제1정규형 변환 후

ID Name Phone Number
1 John 123-4567
1 John 234-5678

 

 

2. 제2정규형 (2NF)

  • 제1정규형을 만족해야 합니다.
  • 기본 키가 아닌 모든 속성이 기본 키에 완전 함수 종속적이어야 합니다.

예제

 

- 기본 테이블 구조

OrderID ProductID ProductName Quantity
1 1 Widget 10
1 2 Gadget 5

 

 

- 제2정규형 변환 후

 

Orders 테이블

OrderID ProductID Quantity
1 1 10
1 2 5

 

Products 테이블

ProductID ProductName
1 Widget
2 Gadget

 

 

3. 제3정규형 (3NF)

  • 제2정규형을 만족해야 합니다.
  • 기본 키가 아닌 모든 속성이 기본 키에 이행적 함수 종속적이지 않아야 합니다.

예제

 

- 기본 테이블 구조

EmployeeID EmployeeName DepartmentID DepartmentName
1 Alice 10 Sales
2 Bob 20 Marketing

 

 

- 제3정규형 변환 후

 

Employees 테이블

EmployeeID EmployeeName DepartmentID
1 Alice 10
2 Bob 20

 

Departments 테이블

DepartmentID DepartmentName
10 Sales
20 Marketing

 

 

4. BCNF (Boyce-Codd 정규형)

  • 제3정규형을 만족해야 합니다.
  • 모든 결정자가 후보 키이어야 합니다.

 

5. 제4정규형 (4NF)

  • BCNF를 만족해야 합니다.
  • 다치 종속을 제거해야 합니다.

 

6. 제5정규형 (5NF)

  • 제4정규형을 만족해야 합니다.
  • 조인 종속을 제거해야 합니다.

6.2 반정규화

반정규화 개념 및 필요성

반정규화는 정규화된 데이터베이스를 성능 향상 또는 관리 편의를 위해 의도적으로 중복을 허용하고 구조를 단순화하는 과정입니다. 반정규화는 데이터베이스의 읽기 성능을 향상시키기 위해 주로 사용됩니다.

 

반정규화의 필요성

  1. 성능 향상 : 정규화된 데이터베이스는 조인 연산이 많아질 수 있으며, 이는 성능 저하로 이어질 수 있습니다. 반정규화를 통해 조인 연산을 줄이고 읽기 성능을 향상시킬 수 있습니다.
  2. 간단한 쿼리 : 정규화된 데이터베이스는 복잡한 쿼리를 필요로 할 수 있습니다. 반정규화를 통해 데이터 구조를 단순화하면 쿼리 작성이 쉬워집니다.
  3. 보고서 생성 : 보고서 생성 시 여러 테이블에서 데이터를 가져와야 하는 경우, 반정규화를 통해 필요한 데이터를 단일 테이블에 저장하여 보고서 생성 속도를 높일 수 있습니다.

예제

 

- 정규화된 테이블 구조

 

Customers 테이블

CustomerID CustomerName
1 Alice
2 Bob

 

Orders 테이블

OrderID CustomerID OrderDate
1 1 2023-01-01
2 2 2023-01-02

 

 

- 반정규화된 테이블 구조

OrderID CustomerID CustomerName OrderDate
1 1 Alice 2023-01-01
2 2 Bob 2023-01-02

 

반정규화된 테이블에서는 CustomerName이 Orders 테이블에 추가되어, 조인 없이 고객 이름을 조회할 수 있습니다.


이 글에서는 데이터베이스 설계와 정규화, 그리고 반정규화에 대해 알아보았습니다. 정규화를 통해 데이터베이스의 무결성과 일관성을 유지하고, 반정규화를 통해 성능을 최적화하는 방법을 이해함으로써 효율적인 데이터베이스 설계를 할 수 있습니다. 다음 단계에서는 SQL의 인덱스와 성능 최적화를 통해 더 깊이 있는 학습을 진행해보겠습니다. Happy Coding!

728x90