목록으로 돌아가기

Ch2. 데이터모델과 SQL

학습목표

헷갈리는 개념 정리

2.1. 정규화

DB 최적화(튜닝) : 이상현상 발생 → 정규화 → 반정규화

  1. 이상현상 : 의도치 않게 데이터 일관성이 깨지는 현상
  2. 정규화
    • 방법 : 이상현상을 방지하기 위해, 데이터 중복 최소화 및 잘 조직된 상태로 분해
    • 장점 : 이를 통해 INSERT/UPDATE/DELETE (쓰기)성능은 올라가지만,
    • 단점 : 많은 조인 발생으로 인해 SELCET (조회)성능이 떨어짐
  3. 반정규화
    • 정규화를 완료한 후, 특정 조회(SELECT) 성능이 너무 느린 것이 확인될 때 어쩔 수 없이 의도적으로 테이블 통합 / 중복 데이터 추가
    • 장점 : 조인 감소로 SELECT (조회)성능 향상
    • 단점 : 그러나, 정규화의 장점은 포기해야함. 데이터 불일치 위험, 쓰기 성능 저하

⚠️ “정규화를 먼저 완벽하게 하고, 꼭 필요한 곳에만 반정규화를 적용해라”

정규화가 항상 SELECT(조회)성능을 떨어뜨리는 건 아니다. 테이블이 깔끔하게 정리되면 인덱스(Index)도 효율적으로 작동해서 조회 성능이 올라가기도 한다.

오히려 정규화가 잘 되어 있지 않으면 불필요한 트랜잭션이 발생하는 등 전체적인 시스템 성능이 떨어질 수 있다. 예를 들어, 학생 1명이 번호 바꾸는데 3군데를 고쳐야 하는 “불필요한 트랜잭션(수정 작업)” 때문에, 조회(읽기)가 아니라 수정/입력(쓰기) 작업에서 시스템 전체가 마비될 수 있다는 뜻이다

따라서 반정규화를 통한 성능향상은 반드시 잘 되어있는 정규화를 전제로 한다. 즉, 반정규화는 지저분한 비정규화 상태를 말하는 게 아니라, 깔끔한 정규화 상태에서 특정 조회 속도 향상이라는 명확한 목적을 가지고 의도적으로 중복을 허용하는 전략

DB 이상현상 (Anomaly)

정규화되지 않은 테이블에 INSERT/UPDATE/DELETE(쓰기)를 하면 데이터 일관성이 깨질 수 있는데 이런 현상을 데이터베이스 이상현상이라고 한다.

  • 삽입이상 : 테이블에 데이터 삽입할 때, 의도치 않은 정보까지 삽입됨
  • 갱신이상 : 중복저장되어 있는 데이터 중 하나만 갱신하고, 다른 하나는 갱신하지 못함
  • 삭제이상 : 테이블에 데이터 삭제할 때, 의도치 않은 정보까지 삭제됨

정규화 절차

정규화 절차 설명
제 1정규화 릴레이션 속성값이 모두 원자값으로만 이루어져야 한다
- 중복값 제거
- PK 설정
제 2정규화 PK가 복합식별자(2개 이상 조합)일 경우, 부분 함수 종속성 제거함
제 3정규화 일반 속성간 이행적 함수 종속성 제거함
BCNF PK제외 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해함

2.1.1. 제 1정규화 : 테이블의 모든 속성값이 원자값을 갖도록 한다.

문제 상황

  • 속성이 여러개의 속성값을 가진다

    학번(PK) 이름 수강과목
    1001 홍길동 “SQL, 데이터모델링”
    1002 김철수 “JAVA”
  • 유사한 속성이 반복된다

    학번(PK) 이름 과목1 과목2 과목3
    1001 홍길동 “SQL” “데이터모델링” NULL
    1002 김철수 “JAVA” NULL NULL

해결책

  • 속성이 여러개의 속성값을 가진다 ➡️ 해당 속성을 별도의 행(Row)으로 분리한다

    학번(PK) 이름 수강과목
    1001 홍길동 “SQL”
    1001 홍길동 “데이터모델링”
    1002 김철수 “JAVA”
  • 유사한 속성이 반복된다 ➡️ 반복되는 속성 그룹을 별도의 테이블로 분리하고, 기존 테이블의 PK를 새 테이블의 FK로 참조한다.

    • 반복되는 속성 제거 (ex. 과목1, 과목2, …)
    • → 새로운 테이블 생성(ex. 수강과목)
    • 새 테이블에 기존 테이블의 PK를 FK로 포함시키고, 반복되던 속성을 컬럼으로 추가함 (ex. 과목1, 과목2, … ➡️ 과목명)

[학생]

학번(PK) 이름
1001 홍길동
1002 김철수

[수강과목]

학번(FK) 과목명
1001 “SQL”
1001 “데이터모델링”
1002 “JAVA”

제 1정규화 이후의 상태 (제 1정규형)

  1. 모든 속성이 하나의 속성값을 가진다 (원자값)
  2. 유사한 속성이 반복되지 않는다 (유사한 속성? 1:M관계)

    새로운 속성을 추가하면 매번 테이블 구조 변경해야한다

  3. 속성의 원자성이 확보되었다
  4. PK에 대해 일반속성은 1:1 관계를 갖는다

    | 학번(PK) | 이름 | 과목1 | 과목2 | 과목3 | | — | — | — | — | — | | 1001 | 홍길동 | “SQL” | “데이터모델링” | NULL | | 1002 | 김철수 | “JAVA” | NULL | NULL |

    • [학번] (1)은 ‘SQL’, ‘데이터모델링’ (M)이라는 여러 값을 가지지 않아야한다.

댓글남기기