Database ‐ 정규화 - woojin-playground/Backend-PlayGround GitHub Wiki

Normalization

  • 정규화는 데이터의 중복을 최소화하고, 데이터 일관성을 보장하며, 데이터 모델을 더 유연하게 만들기 위한 과정이다.
  • 잘 설계된 데이터베이스를 만들기 위한 체계적인 절차라고 볼 수 있다.

함수 종속성

  • 테이블에서 컬럼의 값들이 다른 컬럼의 값을 유일하게 결정하는 관계를 말한다.
  • 기호로는 X -> Y와 같이 표기하며, "X가 Y를 함수적으로 결정한다"라고 읽는다.
  • 쉽게 말해 X값이 Y값을 유일하게 결정한다는 뜻이다.

제 1 정규형 : 테이블의 모든 컬럼이 원자적인 값만을 가져야 한다

  • 갱신 이상 : '션' 회원의 주소가 '부산시 해운대구'로 변경된다면 이 회원이 주문한 모든 데이터를 다 찾아서 주소를 일일이 수정해야 한다. 만약 하나라도 빠뜨린다면 데이터 일관성이 깨진다.
  • 삽입 이상 : 아직 한 번도 주문하지 않은 새로운 회원을 시스템에 등록하고 싶은데 이 테이블 구조로는 주문 정보가 없으면 회원 정보를 추가할 수 없다.
  • 삭제 이상 : 만약 1002번 주문을 취소해서 해당 데이터를 삭제했다면 이 주문이 '네이트' 회원의 유일한 주문이기에 회원 정보 자체가 데이터베이스에서 사라진다.

문제점

  • 데이터 검색의 어려움 : '키보드'가 포함된 주문을 찾으려면 모든 product_infos 문자열을 파싱해서 검색해야 하는데 이는 매우 비효율적이며, SQL의 WHERE절을 제대로 활용할 수가 없다. 특히 인덱스를 제대로 활용할 수 없다.
  • 데이터 수정의 복잡성 : 1001번 주문에서 키보드 수량을 1개에서 2개로 바꾸려면, 이 복잡한 문자열을 애플리케이션에서 읽어와서 분리하고 수량을 수정해 다시 합쳐서 업데이트해야 한다. 데이터베이스가 해야되는 일을 애플리케이션이 하는 것이다.
  • 데이터 타입 사용 불가 : 상품 가격, 수량 등은 숫자 타입으로 관리되어야 합계나 평균 집계 시 쉽게 사용이 되는데 문자열 안에 섞여 있으면 불가능하다.
  • 원자적이란 것은 더 이상 쪼갤 수 없는 값을 말한다.
  • 제 1 정규화를 위의 사례에 적용하기 위해서, 반복되는 상품 정보를 별도의 행으로 분리해야 한다.

제 2 정규형 : 테이블의 모든 컬럼이 기본 키에 대해 완전 함수 종속이어야 한다 & 제 1 정규형을 만족해야 한다

문제점

  • 현재 (order_id, product_id) 복합키다. 주문 ID와 상품 ID가 합쳐져야 하나의 행을 고유하게 식별할 수 있는 것이다.
  • order_priceorder_quantity는 복합키에 종속된다.
  • 그러나 member_id, member_name, ordered_at은 복합키의 일부에만 종속되는데 이렇게 기본 키의 일부에만 종속되는 컬럼이 존재하는 것을 부분 함수 종속이라고 한다. 부분 함수 종속은 데이터 중복 및 이상 현상을 일으킨다.

제 3 정규형 : 이행적 함수 종속이 존재하지 않아야 한다 & 제 2 정규형을 만족해야 한다

문제점

  • member_idordered_at은 PK인 order_id에 종속되어 있다.
  • member_name은 PK가 아닌 member_id에 종속된다.
  • 즉, order_id -> member_id -> member_name과 같은 종속 관계가 나타나는데 이처럼 PK가 아닌 컬럼이 다른 컬럼을 결정하는 관계를 이행적 함수 종속이라고 한다.
  • 데이터베이스에서는 A -> B이고 B -> C일때, 결과적으로 A -> C가 성립하는 관계를 생각하면 이해하기 쉽다.
  • 제 3 정규형은 이런 이행적 함수 종속 관계를 제거한다.
  • 이행적 함수 종속은 다음과 같은 문제를 일으킨다.
    • 갱신 이상 : '션'회원이 '김개발'로 개명하면 member_id가 1인 모든 주문을 찾아 이름을 변경해야 한다. 누락되면 데이터 불일치가 발생한다.
    • 삽입 이상 : 아직 주문을 한 번도 하지 않은 신규 회원은 orders 테이블에 등록할 수 없게 된다. order_id라는 PK가 없기 때문이다.
    • 삭제 이상 : 1002번 주문을 삭제했는데, 이 주문이 '네이트' 회원의 유일한 주문이라면 '네이트'라는 회원 정보 자체가 삭제된다.

실무와 정규화

  • 데이터 중복 최소화 : 불필요한 데이터 중복을 제거해 저장 공간을 효율적으로 사용한다.
  • 데이터 일관성 및 무결성 확보 : 데이터가 여러 곳에 중복 저장되지 않으므로 수정 시 발생할 수 있는 데이터 불일치 가능성을 원천적으로 차단한다.
  • 데이터 이상 현상 해결 : 삽입, 갱신, 삭제 이상 현상을 방지하여 데이터의 신뢰성을 높인다.
  • 유연한 데이터 구조 : 새로운 데이터 요구사항이 발생했을 때, 테이블 구조 변경을 최소화하여 시스템을 확장할 수 있도록 한다.