[TIL / 데이터관리] 데이터베이스 정규화(Normalization)

알락·2022년 10월 24일
0

데이터베이스

목록 보기
3/4

database banner

이미 이전 포스팅에서 소개한 바 있는 MySQl 같은 DBMS(Database Management System)는 데이터를 관리하기 정말 편리한 기능들을 개발자나 데이터 이용자들에게 제공해준다.
하지만 특히 RDBMS(Relational Database Management System)는 그런 데이터를 설계를 잘하여 관리하는 방법이 있다. 이것이 정규화라는 개념이다.

정규화(Normalization)

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

출처 : 위키백과 '데이터베이스 정규화'

위에는 우선 정규화에 대해서 위키백과의 정의에 대해서 다루고 있다.
나는 정규화 중에서 중요한 부분은 데이터 중복 제거구조화라고 생각이 든다.

  1. 데이터 중복 제거
    '데이터 중복 제거'는 한 테이블에 불필요하게 중복되는 정보를 없애는 것이다.
  2. 구조화
    테이블 간의 관계 설계를 잘 해서, 이후 확장되는 관계들이 있을 때 새롭게 스키마를 작성할 필요없이 용이하게 작업을 수행할 수 있게 한다.

이상(Abnomaly) 관계

정규화의 필요를 느끼기 위해서는 현재 본인이 만드는 데이터베이스가 어떤 문제가 있는지부터 알아야 한다. 지금 소개하는 데이터 간의 이상 관계를 알게 되면 문제점이 뚜렷이 나타날 것이다.

학번이름과목코드연락처
1901AliceSB-03010-XXXX-XXXX
2002BobSB-04010-ㅁㅁㅁㅁ-ㅁㅁㅁㅁ
2002BobSB-05010-ㅁㅁㅁㅁ-ㅁㅁㅁㅁ
2003CharlieSB-03010-7777-7777

1) 삭제 이상

Alice의 수강신청 기록을 삭제했다. 하지만 졸업 필수과목이었기 때문에 학과처에서 수강 취소 연유를 묻고자 연락을 해야 한다. 하지만 연락처까지 같이 삭제되었기 때문에 조치를 못 하게 되는 경우가 생긴다. 이렇듯 삭제를 했을 때, 다른 부수 효과를 일으키는 문제를 삭제 이상이라고 한다.

2) 입력 이상

학생의 학번을 기준으로 이름과 연락처를 기재하려고 한다. 하지만 위 테이블에 입력을 하기 위해서는 신청한 과목 코드를 NULL로 처리를 해야 입력이 가능하다. 이렇듯 새로운 데이터를 입력할 때, 꼭 필요한 정보 이외의 불필요한 처리를 동반하는 문제를 입력 이상이라고 한다.

3) 수정 이상

특정 학생의 연락처를 바꾸려고 한다. 위 예시에서는 특히 'Bob'의 경우를 특정할 수 있다. 한 사람의 연락처를 바꿔야 하는데, 위 테이블은 'Bob'에 해당되는 정보가 2 개여서 똑같은 수정을 두 번 실행해야 한다.


정규화 작업

진짜 정말 기록하는데에만 의미를 두고 테이블을 생성하단면, 딱 비정규적인 테이블이 만들어질 것이다. '에드거 F. 커드'와 '레이먼드 F. 보이스'는 이러한 테이블을 정규화시키는 방법을 고안해서 제안했다.
그 중 일반적인 작업은 다음과 같다.

  1. 1NF(1차 정규화)
  2. 2NF(2차 정규화)
  3. 3NF(3차 정규화)
  4. BCNF(Boyce and Cudd Normal Form)

⌞ 1NF

다음의 조건을 만족하면 된다.

  1. 모든 Domain이 원자값(Atomic Value)만으로 되어 있다.
  2. 모든 attribute에 반복되는 그룹(repeating group)이 나타나지 않는다.
  3. 기본 키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.

1번 조건 위배 예시

1 violation

2번 조건 위배 예시

2 violation

3번 조건 위배 예시

3 violation

올바른 1NF 예시

1NF Pass

결과적으로는 1:N 의 관계를 갖는 테이블 2개로 나뉘어진다.


⌞ 2NF

모든 컬럼이 기본 키에 대하여 완전 함수형 종속이 되는 것이 조건이다.

함수형 종속이란 XYX \rightarrow Y 로 표현할 수 있는데, X가 바뀌면 Y는 X를 따라 다른 값을 취해야 한다. 만약 {X1,X2}Y\lbrace X_1, X_2 \rbrace \rightarrow Y 의 형태로 결정자가 추가되었는데 모든 결정자에 대해 Y가 값이 변경된다면 이때 완전 함수형 종속이고, 부분만 따른다면 부분 함수형 종속이라고 한다.

2NF 위반 예시

2NF violate

올바른 2NF 예시

2NF pass

제조사와 모델 명이 결정자일 때, 제조국가는 모델 명과는 상관이 없는 속성이므로 따로 테이블을 구분해서 작성해준다.

⌞ 3NF

  1. 관계가 2NF를 따른다.
  2. 기본 키가 아닌 다른 속성들은 기본 키에 의존해야 한다.(혹은 이행적 함수 종속이 아니어야 한다.)

3NF 위반 예시

3NF violation

올바른 3NF 예시

3NF pass

대회명과 개최연도에 따라 우승자는 달라지지만, 대회명과 개최연도가 우승자의 생일과는 관련이 없다.

⌞ BCNF

모든 결정자가 후보키 집합에 속해야한다.

후보키는 각 행을 유일하게 식별할 수 있는 최소한의 집합이다.

타입등록번호담당자위치
KICK114235Alice중앙로
KICK123543Alice시청
BIC114235Bob광장
BIC123543Bob시민공원

각 탈 것을 특정 지을 수 있는 후보키는 타입과 등록번호다. 이를 통해 고유한 한 탈 것의 위치를 찾을 수 있다. 하지만 담당자 1명이 담당하는 모델이 정해져있다고 하자. 그렇다면 담당자는 타입에 대한 결정자가될 수 있다. 이 경우에는 BCNF에 해당되지 않아 담당자의 배정 타입 관련 테이블 따로, 탈 것과 위치에 대한 테이블 따로 관리를 해야 한다.

참고

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!

0개의 댓글