정규화와 비정규화

duckbill413·2023년 10월 18일
0

MySQL

목록 보기
2/5
post-thumbnail

정규화, 비정규화

데이터베이스 정규화

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하고 작고 잘 조직된 관계를 생성하는 것에 있다. 일반적으로 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함한다. 정규화의 목적은 하나의 테이블에서 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다.

정규화 유형

일반적인 환경에서 가장 많이 사용되는 정규화는 1NF, 2NF, 3NF이다. 하지만 정규화는 데이터베이스의 구조와 특성에 따라 달라질 수 있으며, 필요한 정규화 수준을 선택하는 것은 개발자의 판단에 달려있다.

제 1정규화(1NF)

  • 모든 도메인이 원자값(Atomic value)만 가지도록 테이블을 구성합니다.
  • 테이블의 각 컬럼은 반드시 하나의 값만 가져야 합니다.

제 2 정규화 (2NF)

  • 테이블의 모든 컬럼이 기본 키에 완전 함수적 종속(Fully Functional Dependency)해야 합니다.
  • 완전 함수적 종속이란 기본 키의 어떤 부분이라도 기본 키 전체에 종속된 경우를 말합니다.

제 3 정규화 (3NF)

  • 테이블 내에 존재하는 모든 컬럼이 기본 키에 비이행적 함수 종속(Non-Transitive Dependency)을 가져야 합니다.
  • 비이행적 함수 종속이란 A->B, B->C와 같이 종속 관계에서 A->C와 같은 종속 관계가 발생하지 않는 경우를 말합니다.

보이스-코드 정규화 (BCNF)

  • 모든 결정자가 후보키(Candidate Key)인 테이블을 만드는 것을 말합니다.
  • 후보키가 아닌 속성에 함수적 종속이 발생하지 않도록 테이블을 분해해야 합니다.

제 4 정규화 (4NF)

  • 다중 값 종속(Multi-Valued Dependency)을 제거하여 테이블을 분해합니다.
  • 다중 값 종속이란 A->->B와 같이 하나의 속성이 아닌 여러 개의 속성에 종속되는 경우를 말합니다.

제 5 정규화 (5NF)

  • 조인 종속성(Join Dependency)을 제거하여 테이블을 분해합니다.
  • 조인 종속성이란 두 개 이상의 테이블을 조인하여 얻을 수 있는 의미 있는 속성의 종속성을 말합니다.

정규화

  1. 중복을 제거하고 한 곳에서 관리
  2. 데이터 정합성 유지가 쉬움
  3. 읽기시 참조 발생

비정규화

  1. 중복을 허용
  2. 데이터 정합성 유지가 어려움
  3. 참조없이 읽기 가능

실무에서의 정규화에 대한 고민

중복된 데이터이면 반드시 정규화를 해야하는 것인가

  • 정규화도 비용이다.
  • 읽기 비용을 지불하고 쓰기 비용을 줄이는 것
  • 읽기/쓰기 서로의 비용을 고려할 필요가 있다.

정규화시 고려해야 하는 것

  • 얼마나 빠르게 데이터의 최신성을 보장해야 하는가?
  • 히스토리성 데이터는 오히려 정규화를 하지 않아야 한다.
  • 데이터 변경 주기와 조회 주기는 어떻게 되는가?
  • 객체(테이블) 탐색 깊이가 얼마나 깊은가

  • 깊이에 따라 테이블의 참조가 변하게 된다.

정규화를 하기로 했다면 읽기시 데이터를 어떻게 가져올 것인가?

  • 테이블 조인을 사용하여 데이터를 가져올 수 있다.
    • 테이블 조인은 서로 다른 테이블의 결합도를 엄청나게 높인다.
  • 조회시에는 성능이 좋은 별도 데이터베이스나 캐싱등 다양한 최적화 기법을 이용할 수 있다.
  • 조인을 사용하면, 이런 기법들을 사용하는데 제한이 있거나 더 많은 리소스가 들 수 있다.
  • 읽기 쿼리가 한번 더 발생되는 것은 그렇게 큰 부담이 되지 않을 수 있다.
profile
같이 공부합시다~

0개의 댓글