정규화

2024. 5. 15. 17:35

정규화

  • ERD 내에서 중복 요소를 찾아 제거해 나가는 과정 (중복된 데이터는 많은 문제를 일으킨다.)
  • 3차 정규화 정도만 알면 설계하는데 무리가 없다.
  • 중복을 최소화 -> 완전히 없애는 것이 아니라 어느 정도는 인정하겠다.
  • 시간을 줄이기 위해(성능 최적화)

정규화 절차

 - 함수 종속성을 이용해 릴레이션을 연관성 있는 속성들로만 구성되도록 분해함.

 

제 1 정규화

  • 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 해당 컬럼을 제거하고 기본테이블의 PK를 추가해 새로운 테이블을 생성하고, 기존의 테이블과 1:N 관계를 형성하는 것.

제 2 정규화

  • PK가 여러 키로 구성된 복합키로 구성된 경우
  • 복합키 전체에 의존하지 않고 복합키의 일부분에만 종속되는 속성들이 존재할 경우(즉, 부분적 함수 종속 관계) 이를 분리하는 것.

제 3 정규화

  • 테이블의 키가 아닌 컬럼들은 기본키에 의존해야 하는데 겉으로는 그런 것처럼 보이지만 실제로는 기본키가 아닌 다른 일반 컬럼에 의존하는 컬럼들이 있을 수 있다.(이전적 함수 종속 관계)
  • PK에 의존하지 않고 일반 컬럼에 의존하는 컬럼들을 분리한다.

결국 정규화 과정이란, 중복된 속성을 최소화하고 종속관계에 있는 속성을 제거하는 과정이다. 이러한 정규화 과정을 다시 조인하면 데이터의 손실없이 이전상태로 복구가 가능해야 한다.

 

 

역정규화

- 논리적 정규화를 통해 만든 표를, 개발적 측면에서 성능이나 편의성을 위해서 되돌아가는 작업. (정규화를 한다고 해서 반드시 성능을 떨어뜨리는 것이 아니다.)

 

 

 

=======================

정규화란 - 테이블 간에 중복된 데이터를 허용하지 않는다는 것.

중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.

 

제 1 정규화

- 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것.

 

제 2 정규화

 - 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것.

 - 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 것.

 

제 3 정규화

 - 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것.

 - 이행적 종속이란 A -> B, B -> C가 성립할 때, A -> C가 성립되는 것을 의미한다.

 

BCNF 정규화

 - 제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것.

 

 

  1. 정규화란 무엇이며, 왜 중요한가요?
    • 데이터 중복 최소화 : 저장 공간 효율적 사용, 데이터 일관성 유지
    • 데이터 무결성 보장 : 데이터의 정확성과 일관성 유지, 신뢰성 높임
    • 데이터 조작 간소화 : 데이터 삽입, 삭제, 갱신 시 발생할 수 있는 이상을 방지
    • 데이터 구조의 명확성
  2. 정규화를 적용할 때 주의해야 할 점은 무엇인가요?
    • 지나친 정규화
      • 지나친 정규화는 과도한 테이블 분할을 초래하여 쿼리 성능을 저하시킬 수 있다.
      • 지나친 조인 연산으로 인해 응답 시간이 길어질 수 있다.
    • 비정규화의 필요성
      • 성능 최적화가 필요한 경우 비정규화를 통해 데이터 중복을 허용하고 조회 속도를 높일 수 있다.
      • 읽기 성능이 중요한 로그 데이터나 분석 데이터 등
  3.  데이터베이스 설계 시 정규화를 어느 단계까지 적용해야 하는지 설명해보세요.
    • 대부분의 실무에서는 제 3 정규형까지 적용한다.
    • 데이터 무결성과 성능 사이의 균형을 잘 맞출 수 있는 단계
  4. 정규화를 거치면서 발생할 수 있는 '이상(Anomalies)'에는 어떤 종류가 있나요?
    • 삽입 이상(Injection Anomaly)
      • 특정 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 경우
      • ex) 새로운 학생을 추가하기 위해 수강 과목도 함께 입력해야 하는 경우
    • 갱신 이상(Update Anomaly)
      • 동일한 데이터가 여러 곳에 존재하여 하나를 수정할 때 모두 수정해야 하는 경우
      • ex) 학생의 주소를 변경할 때 여러 테이블에 존재하는 주소 데이터를 모두 수정해야 하는 경우
    • 삭제 이상(Delection Anomaly)
      • 특정 데이터를 삭제할 때 불필요하게 다른 데이터도 함께 삭제되는 경우
      • ex) 한 학생이 수강을 중단할 때 그 학생의 모든 정보가 삭제되는 경우
      •  
  5.  정규화된 데이터베이스의 성능을 개선하기 위해 사용할 수 있는 기법은 무엇인가요?
    • 인덱싱 
      • 자주 사용되는 컬럼에 인덱스를 생성하여 검색 속도를 향상시킨다.
      • 단, 너무 많은 인덱스는 삽입/삭제 성능을 저하시킬 수 있다.
    • 캐싱
      • 자주 조회되는 데이터를 캐시하여 데이터베이스 부하를 줄인다.
      • Redis와 같은 인메모리 데베를 사용할 수 있다.
    • 파티셔닝
      • 큰 테이블을 여러 파티션으로 나누어 관리함으로써 성능을 향상시킨다.
      • 수평파티셔닝(Shard)와 수직파티셔닝(Split)이 있다.
    • 비정규화
      • 읽기 성능을 높이기 위해 일부 중복 데이터를 허용하는 비정규화 적용 가능
      • 성능과 데이터 무결성 사이의 균형을 맞추는 것이 중요하다.
  6. 정규화된 데이터베이스에서 발생할 수 있는 성능 문제를 진단하는 방법은 무엇인가요?
    • 성능 문제 진단 도구
      • 쿼리 프로파일링 도구 : MySQL의 'EXPLAIN', PostgreSQL의 'EXPLAIN ANALZY' 등을 사용하여 쿼리 실행 계획을 분석.
      • 모니터링 도구 : Prometheus, Grafana 등을 사용하여 데이터베이스 성능을 모니터링한다.
    • 성능 문제 해결 접근 방법
      • 쿼리 최적화 : 느린 쿼리를 식별하고 인덱스를 추가하거나 쿼리 구조를 개선한다.
      • 인덱스 사용 : 자주 조회되는 컬럼에 인덱스 추가하여 검색 성능 향상
      • 캐싱 : 자주 사용되는 데이터를 캐시하여 데베 부하를 줄인다.
      • 비정규화

'Database' 카테고리의 다른 글

인덱스(Index)  (0) 2024.02.21
트랜잭션(Transaction)  (0) 2024.02.21
NoSQL  (0) 2024.02.15

BELATED ARTICLES

more