Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

250218 - 데이터베이스 정규화와 비정규화의 이해(데이터 무결성) 본문

TIL

250218 - 데이터베이스 정규화와 비정규화의 이해(데이터 무결성)

queenriwon3 2025. 2. 18. 23:52

▷ 오늘 배운 

 

오늘은 프로젝트를 진행하면서 ERD를 어떻게 구현할지 고민에 도움이되고 확신을 준 정규화와 비정규화에 대해 작성해보도록 하겠다.

오늘까지 TIL을 간단하게 작성하고, 내일 프로젝트를 하면서 생긴 트러블슈팅을 작성할 것이다.

 

 

<<목차>>

1. 정규화

    1) 비정규화 상태인 테이블 

    2) 제1 정규형 (1NF)

    3) 제2 정규형 (2NF) 

    4) 제3 정규형 (3NF) 

    5) 4NF (제4 정규형)

    6) 5NF (제5 정규형)

    7) 6NF (제6 정규형)

2. 비정규화(역정규화)

    1) 비정규화

    2) 역정규화가 필요한 상황

    3) 비정규화 된 테이블

 

 

 


 

1. 정규화

1) 비정규화 상태인 테이블 

  • 중복 데이터
  • 유연성 부족
  • 데이터 무결성 문제 등…
    (데이터 무결성이란, 테이블은 특정 규칙과 제약 조건(기본 키, 외래 키, 유니크 등)을 통해 데이터를 저장함으로써 데이터의 무결성(정확성, 일관성, 유효성)을 유지하는 것)

 

데이터 무결성이란?
  1. 정확성: 데이터가 올바르고 오류 없이 저장되는 것
    ex) 숫자로 저장되어야 하는 값이 문자로 저장되지 않도록 하는 것.
  2. 일관성: 데이터가 서로 모순되지 않고 조화를 이루는 상태를 유지하는 것
    ex) 외래 키 제약 조건을 통해 두 테이블 간의 관계가 일치하는 것을 보장하는 것.
  3. 완전성: 필요한 모든 데이터가 빠짐없이 저장되고 관리되는 것
    ex) 필수 입력 항목이 비어 있지 않도록 하는 것.

==> 데이터가 입력, 저장, 전송, 처리되는 동안 변경되거나 손상되지 않도록 보장하는 개념

 

 

 

2) 제1 정규형 (1NF) - 중복 제거 및 원자성 유지

: 모든 컬럼이 원자적 값(Atomic Value) 을 가져야 한다.

컬럼에 중복 데이터가 포함되면 안 된다.

학생(student_name)이 여러개의 수업(course)을 들을 수 있다.

따라서 course_1, course_2, course_3 을 하나의 course로 하나의 칼럼이 다룰 수 있도록 행 단위로 정리한다.

 

 

3) 제2 정규형 (2NF) - 부분적 종속 제거

앞의 1NF가 만족되어야하고, 테이블의 모든 컬럼이 완전 함수적 종속(Full Functional Dependency) 을 가져야 한다.(즉, PK의 일부가 아닌 전체를 기준으로 결정돼야 함)

—> 학생과, 수업정보를 별도의 테이블로 가질 수 있도록 한다. 이후 따로 매핑 테이블을 만든다.

 

부분적 종속(Partial Dependency)이란?

기본 키(PK)가 여러 개의 속성(컬럼)으로 이루어진 복합 키(Composite Key) 일 때, 그중 일부만으로 특정 속성이 결정되는 경우

 

중간테이블(외래키(student_id)와 외래키(course_id의 조합)

 

위 테이블은 제 3 정규형도 만족하고 있다.

 

 

4) 제3 정규형 (3NF) - 이행적 종속 제거

2NF를 만족해야하고, 이행적 종속을 제거해야한다.

(즉, A → B, B → C 관계라면 A → C가 되도록 변경)

—> A->B (student_name -> student_id)

       B->C (course_id -> course_name)

       A->C (student_name(id) -> course_name(id))

 

 

 

 

 

 

—- 이 이후로는 실무에서 사용을 거의 하지 않는다.

 

5) 4NF (제4 정규형) - 다치 종속 제거

다치 종속(Multivalued Dependency, MVD) 을 제거해야 한다.

예를 들어, 한 학생이 여러개의 강의와 취미를 한번에 가지고 있을때(독립적이지만 다른테이블에 존재할 때), 강의관련 테이블과 취미테이블을 분리 시킨다.

 

6) 5NF (제5 정규형) - 조인 종속 제거

조인 종속(Join Dependency, JD) 을 제거해야 한다.

관련이 있는 칼럼끼리 테이블을 구성하되, 데이터를 특정방식으로 나누고 다시 조인 했을 때 원본이 복구 되어야한다.

 

7) 6NF (제6 정규형) - 비정규 조인 제거

비정규 조인(Non-trivial Join Dependency) 을 제거해야 한다.

시간에 따라 변하는 속성(Temporal Data)을 적절히 분리해야 한다.

 

 

 

 

 

2. 비정규화(역정규화)

1) 비정규화

정규화(Normalization)를 통해 데이터 중복을 제거하고 무결성을 유지할 수 있지만, 너무 많은 조인을 필요로 하면 성능 저하가 발생할 수 있다.

 

일부 중복을 저장하여 조회하는 속도를 높일 수 있다.(읽기 성능이 중요할때)

 

 

2) 역정규화가 필요한 상황

1️⃣ 조회(Query) 성능 최적화

  • 정규화된 데이터는 조회 시 여러 테이블을 조인해야 하므로 성능이 저하될 수 있다. 따라서 조회 성능을 높이기 위해 역정규화를 통해 조인을 줄이고 단일 테이블에서 필요한 데이터를 조회할 수 있도록 한다.

2️⃣ 읽기(Read)가 많고, 쓰기(Write)가 적은 경우

3️⃣ 데이터 중복보다 성능(빠른 검색속도)이 중요한 경우

4️⃣ 조인 비용이 높은 관계형 데이터

  • 다량의 데이터를 조인하는 경우, 조인 성능이 느려질 수 있음. -> 일부 중복 허용으로 조인사용을 줄이자

 

예를 들어 하나의 게시물에 다량의 좋아요가 작성이된다면, 훨씬 더 많은 좋아요 테이블의 행이 발생할 것이며, 조회하고 쿼리를 사용하는데 지장이 있을 수 있다.(like_count 같은 것을 계산할 때..)

그럴 경우 like_count의 갯수를 게시글당 지정을 하여 좋아요를 누를때마다 +1 연산이 되도록 한다.

그런데 이럴경우 누가 좋아요를 눌렀는지 어떻게 아는 걸까? 비정규화를 과제 및 프로젝트에 적용하기 위해서는 생각해봐야하는 문제인 것 같다.

(특히 대용량 데이터를 다룰 때…)

 

 

3) 비정규화 된 테이블

비정규화를 하는 방법

1️⃣ 중복된 칼럼을 추가

2️⃣ 중복된 테이블 저장

3️⃣ 사용하게 될 계산된 필드를 저장하여 사용

4️⃣ 이력 테이블 사용: 실시간 조회를 위해 캐싱과 같은 방식으로 데이터를 미리 저장해둘 수 있다.

 

특히 이력데이터는 시간마다 변화하므로 실시간으로 변화하는 값을 가져올 수 있도록 캐시를 받아온다.