CS
  • CS-Study
  • database
    • B-Tree와 B+Tree
    • DB JOIN
    • DB Lock
    • DB 트래픽
    • DBCP (DB Connection Pool)
    • Flyway
    • Message Broker
    • MySQL InnoDB 스토리지 엔진
    • MySQL 엔진 아키텍처
    • RDB와 NoSQL
    • Redis
    • SQL Injection
    • 스키마 (Schema)
    • Table Scan과 Index Scan
    • Apache Kafka
    • Key
    • 뷰 (View)
    • 인덱스
    • 정규화
    • RDBMS, NoSQL의 클러스터링/리플리케이션 방식
    • 트랜잭션(Transaction)
    • 트랜잭션의 격리성(Transaction Isolation)
    • 프로시저와 트리거
    • DB 정규화 (Normalization)
  • etc
    • MSA
    • REST, REST API, RESTful
    • SOLID 원칙
    • TDD (Test-Driven Development)
    • 서버리스
    • 컨테이너와 도커
  • java
    • Collections
    • Garbage Collection
    • Generic
    • JDBC
    • Java Virtual Machine(JVM)
    • Java Thread
    • Java8 vs Java11 vs Java17
    • 객체지향 프로그래밍 OOP (Object Oriented Programing)
    • Optional
    • RxJava(Reactive Programming)
    • 문자열(String & StringBuffer & StringBuilder)
    • Synchronized
    • Virtual Thread
    • Wrapper Class
    • Equals()와 Hashcode()
    • final
    • Jackson 라이브러리
    • 리플렉션(Reflection)
    • static class와 static method
    • 스트림(Stream)과 람다(Lambda)
    • 스프링 프레임워크에서 사용되는 디자인 패턴
    • 예외처리(Exception)
    • Java Annotation
    • 추상클래스와 인터페이스
  • network
    • 3-way handshake
    • 4-way Handshake
    • DHCP(Dynamic Host Configuration Protocol)
    • DMZ(DeMilitarized Zone)
    • DNS(Domain Name System)
    • HTTP Method
    • HTTP 버전 비교
    • HTTP status code
    • HTTP
    • IP Address
    • Mutiplexing & Demultiplexing
    • OSI 7계층
    • SOP, CORS
    • TCP와 UDP
    • XSS와 CSRF
    • gRPC
    • Stateless와 Connectionless
    • 라우터 Router
    • 로드밸런서(Load Balancer)
    • 브라우저에 URL입력시 네트워크 상 일어나는 일
    • 서브넷 마스크, 게이트웨이
    • 웹 소켓과 소켓 통신
    • 쿠키(Cookie)와 세션(Session)
  • operating-system
    • IPC (Inter Process Communication)
    • 인터럽트
    • TLB
    • 스레싱 Thrashing
    • Thread Pool, Fork-Join
    • Thread Safe
    • 프로세스
    • 가상 메모리
    • 데드락 (DeadLock, 교착 상태)
    • 동기/비동기 & 블로킹/논블록킹
    • 동기화(Synchronization)
    • 메모리 할당과 단편화
    • 뮤텍스와 세마포어, 모니터
    • 세그먼테이션과 페이징
    • 운영체제
    • 캐시 메모리
    • Context switching(문맥 교환)
    • 컴파일
    • 파일 시스템
    • 페이지 교체 알고리즘(Page Replacement Algorithm)
    • 프로세서 스케줄링 알고리즘
    • 프로세스 주소 공간
  • spring
    • @Transactional
    • AOP(Aspect-Oriented Programming)
    • DTO, DAO, VO, Entity
    • DispatcherServlet
    • Hibernate, JPA, Spring Data JPA
    • Ioc와 DI
    • JPA 연관관계 맵핑
    • N+1 Problem
    • ORM
    • Persistence Context
    • SQL Mapper vs ORM vs QueryBuilder
    • Servlet Filter와 Spring Interceptor
    • Servlet
    • Spring MVC와 Spring Boot
    • Tomcat
    • WebFlux
Powered by GitBook
On this page
  1. database

정규화

Previous인덱스NextRDBMS, NoSQL의 클러스터링/리플리케이션 방식

Last updated 1 year ago

정규화가 무엇인가요?

  • 정규화란 데이터베이스 테이블 간에 중복된 테이터를 허용하지 않는 것을 말한다. 이를 통해 무결성을 유지하고 저장 용량을 줄일 수 있다.

  • 정규화는 테이블을 어떻게 분해할지에 따라서 단계가 달라진다.

제1, 2, 3 정규화 되기 전후의 테이블 변화

1) 제1 정규화 : 테이블의 칼럼이 하나의 값을 갖도록 테이블을 분해하는 것.

스크린샷 2023-06-27 오후 6 45 50

위에서 아래 형태로 분해하는 것이 제1 정규화다. 왼쪽은 여러 취미를 가지고 있는 행이 있기에 제1 정규화를 만족하지 못하고 있는 상황이다.

2) 제2 정규화: 제1 정규화를 진행한 테이블에 대해서 기본키의 부분 집합이 결정자가 되지 않게 분해하는 것.

3) 제3 정규화 : 제2 정규화를 만족하는 테이블의 이행 종속을 제거하도록 분해한다. 즉, (a→b, b→c 가 성립될 때, a→c가 되는 테이블이 있다면 이를 분해한다)

4) BCNF 정규화 : 값을 정하는 결정자가 후보키가 되도록 분해한다

학생번호와 특강이름을 기본키로 가지고 있다. 이 기본키가 교수를 결정하고 있고, 교수는 특강이름을 결정하고 있다. 교수는 특강이름의 결정자이지만, 후보키는 아닌 상태다.

또한 위 경우엔 새로운 교수가 특정 과목을 담당하는 정보를 바로 추가할 수 없다. 왜냐면 적어도 한 명의 학생이 필요하기 때문이다. 정규화가 필요하다.

정규화 하지 않을 경우의 이상현상

정규화의 추가 목적은 이상 현상을 제거하기 위해서 데이터베이스를 올바르게 설계하가는 것이다.

발생할 수 있는 이상 현상의 종류

  1. 삽입 이상 : 데이터를 삽입하기 위해 불필요한 데이터를 추가해야만 삽입이 가능한 상황

  2. 갱신 이상 : 전체 데이터 중 일부만 변경하여 데이터가 불일치하는 상황

  3. 삭제 이상 : 삭제로 인해 꼭 필요한 데이터까지 삭제되는 상황

위의 BCNF 정규화 과정에 대입해서 설명하겠다.

BCNF 정규화 전에는 위 3개의 이상현상이 모두 발상한다.

  • 삽입 이상 : 학생이 없이는 새로운 특강을 추가할 수 없다. 적어도 한 명의 학생이 필요한 상황이다.

  • 갱신 이상 : 김교수가 담당하는 소셜네트워크의 특강 이름이 변경되면 각 행을 모두 찾아서 변경해야 한다.

  • 삭제 이상 : 502번 학생이 특강을 취소하면 박교수가 창업전략을 담당한다는 정보도 같이 삭제된다.

어떤 상황에서 반정규화(역정규화)를 하는게 좋을지 설명해주세요

정규화 예시 참고 https://mangkyu.tistory.com/110

스크린샷 2023-06-27 오후 6 46 10
스크린샷 2023-06-27 오후 6 51 36

위 테이블은 학생번호, 강좌이름의 복합키를 기본키로 두고 있다. 강의실은 복합키 중 강좌이름에만 종속되기에 분해할 수 있다. 분해하면 아래 테이블과 같다.

스크린샷 2023-06-27 오후 6 55 28

학생 번호와 수강료는 이행종속 상태이지만, 둘 간의 관계는 없다. 이런 이행종속 상태는 아래의 테이블처럼 분해한다.

스크린샷 2023-06-27 오후 7 07 17

아래와 같이 정규화를 할 수 있다.

정규화로 데이터가 일관성을 가질 순 있지만, Join이 많아지고 요청 쿼리가 복잡해져 시간이 오래걸릴 수 있다. 상황에 따라서 역정규화를 통해서 조회 성능에 초점을 맞추는것이 좋다. 중복된 데이터를 처리하기에 쓰기 연산이 발생하겠지만, 조회가 많이 발생하는 부분에서는 역정규화가 필요하다. 예를 들자면, 집계 컬럼을 추가하여 다양한 정렬이 자주 쓰이는 페이징에서 연산 쿼리가 발생하지 않게 설계할 수 있다.