정규화란?

Kim sejin·2023년 12월 27일

SQL

목록 보기
3/3
post-thumbnail

제 1정규화

회원번호회원이름프로그램
101강호동스쿼시초급
102손흥민헬스
103김민수골프초급

위와 같은 예시에서 김민수라는 사람이 헬스를 추가 신청하였다.


회원번호회원이름프로그램
101강호동스쿼시초급
102손흥민헬스
103김민수헬스
103김민수골프초급, 헬스

만약 이렇게 등록한다면 나중에 각각의 데이터를 찾기가 어렵고, sql문을 작성할 때 like 문을 작성해야하기 때문에 성능이 저하될 수 있다. 프로그램 이름 수정할 때도 마찬가지이다. 따라서 제 1정규화를 진행하여야 한다.


"한 칸에 하나의 데이터만" - 제 1정규화

회원번호회원이름프로그램
101강호동스쿼시초급
102손흥민헬스
103김민수헬스
103김민수골프초급

위와 같은 테이블을 제 1정규형 테이블이라 한다.


제 2정규화

Easy Version

쉽게 말하면 현재 테이블의 핵심 주제와 상관없는 컬럼을 제거하는 것이다. 밑의 예제로 알아보자.


수강 등록 현황 table

회원번호회원이름프로그램가격납부여부
101강호동스쿼시초급50000
102손흥민헬스60001
103김민수헬스60001
103김민수골프초급80000

프로그램마다 가격과 납부여부가 추가되었다. 만약에 헬스 가격이 7000원으로 수정되면 6000원을 모두 7000원으로 바꾸어주어야한다. 컬럼 수가 많으면 더 많은 시간이 걸린다. 이러한 불상사를 줄이기 위해 제 2정규화를 진행하여야 한다.


현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업 - 제 2정규화

가격 컬럼은 현재 수강 등록 현황 테이블과 주제 관계가 없다. 위 테이블은 회원들이 어떤 프로그램을 등록하였는지 저장하기 위한 테이블이다. 따라서 가격 컬럼을 다른 테이블로 뺄 수 있다.


수강 등록 현황 table

회원번호회원이름프로그램납부여부
101강호동스쿼시초급0
102손흥민헬스1
103김민수헬스1
103김민수골프초급0

프로그램 table

프로그램가격
스쿼시초급5000
헬스6000
골프초급8000

위와 같은 테이블을 제2정규형을 만족하는 테이블이라 한다.
하지만 단점도 있다. 손흥민이 얼마를 내야하는지 알고 싶다면 현재 테이블을 제외하고 다른 테이블에서 데이터를 가져와야지 알 수 있다(Selete 시)

따라서 NoSQL처럼 비관계형 데이터베이스를 사용하는 경우도 있다. 비관계형 데이터베이스들은 정규화를 하지 않는다. 관계형 데이터베이스는 테이블을 정규화 해두는 것이 일반적이다.

Hard Version

제 2정규형의 정확한 정의는 partial dependency를 제거한 테이블이다. 밑의 예제를 통해 알아보자.


id회원이름프로그램납부여부
101강호동스쿼시초급0
102손흥민헬스1
103김민수헬스1
103김민수골프초급0

알다싶이 첫번째 컬럼인 id가 primary key를 뜻하며 행을 구분하기 위해 만든 컬럼이다. 만약에 primary key 컬럼이 없다면 Composite primary key를 정의할 수 있다. 위의 테이블에서는 id와 프로그램명(Composite primary key)이 primary key 역할을 수행할 수 있다.


회원번호프로그램
101스쿼시초급
102헬스
103헬스
103골프초급

따라서 두 개의 컬럼을 연결한다. 이때 이 컬럼 두개를 Composite Primary key라고 한다. 합하면 Primary key 역할을 할 수 있는 컬럼들이다.


그래서 partial dependency가 뭔데?

id회원이름프로그램가격납부여부
101강호동스쿼시초급50000
102손흥민헬스60001
103김민수헬스60001
103김민수골프초급80000

Composite Primary Key에 종속된 컬럼이 있다. 예를 들어 가격 컬럼은 프로그램 컬럼에 종속되어 있다. 가격은 프로그램에 따라서 결정이 된다. 이처럼 하나의 Composite Primary key(column)에 종속되어 있으면 partial dependency가 존재한다고 판단한다.

따라서 partial dependency를 제거하면 제 2정규화가 완성된다.


제3정규화

제 3정규화는 일반 컬럼에만 종속된 컬럼은 다른 테이블로 빼기이다. 밑의 예제를 살펴보자.

프로그램가격강사
스쿼시5000김을용
헬스6000박덕팔
골프8000이상구
골프중급9000이상구
개인피티6000박덕팔

위는 컬럼은 partial dependency가 존재하지 않는다. 왜냐하면 composite primary key가 없기 때문이다. 따라서 primary 하나만 존재한다. 네번째의 출신대학은 primary key와 상관이 없다. 강사라는 컬럼에만 종속되어있다.

만약 이상구라는 사람의 대학이 서울대로 수정해야한다면 제 2정규형이 진행된 테이블에서는 강사가 모두 이상구인 사람을 서울대로 변경해야 한다. 따라서 데이터가 많아질수록 더 오래 걸리고, 여러곳을 수정해야한다. 따라서 제 3정규화가 필요하다.


program 테이블

프로그램가격강사
스쿼시5000김을용
헬스6000박덕팔
골프8000이상구
골프중급9000이상구
개인피디6000박덕팔

teacher 테이블

강사출신대학
김을용서울대
박덕팔연세대
이상구고려대

따라서 위처럼 테이블을 수정하면 제3정규형을 만족하는 테이블이 된다.

참고 영상 및 출처

정규화 참고영상

0개의 댓글