nan + nan = 2nan

[Database] 데이터 정규화 본문

Database

[Database] 데이터 정규화

2nan 2024. 4. 8. 23:44
728x90


요즘 NoSQL 관련 데이터 설계를 진행하면서, 데이터 모델링에 관한 내용들을 많이 찾아보고 있다.

그러다 문득 코딩애플님의 영상이 알고리즘에 뜨게 되었고, 데이터 정규화에 대한 내용을 보게 되었다.

 

 

https://youtu.be/Y1FbowQRcmI?si=VdWDaepZtCuzeOTT

코딩애플님의 데이터 정규화

 

해당 영상에선 정말 쉽게 정규화에 대해 설명해준 것 같다.

예전 자격증 시험 볼 때, 뭔 소린지 대략적으로는 알겠는데 뭔 소린지는 모르겠는.. 그런 단어들이
비전공자인 나를 괴롭혔던 기억이 있다.

나같은 사람도 정말 쉽게 이해시켜준 영상이라 참고하면 좋을 것 같다.

정리하는 김에 간단하게 몇 글자 적어본다.

 

 

제1정규화


하나의 컬럼엔 하나의 데이터만 가진다.

 

제1정규화 전)

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

단점)

- 나중에 골프 초급만 한 사람을 찾고 싶을 때, 조건식이 추가되어 귀찮아진다.
- 값 수정 시, 골치가 아파진다

ex) where = "골프 초급" 으로 될 걸,
    where 프로그램 LIKE "%골프초급%"을 사용해 데이터가 많아질 수록 쿼리 조회 시 성능 저하 우려  

 

제1정규화 후)

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

 

 

제2정규화


현재 테이블의 주제와 상관없는 컬럼 분리

 

수강등록현황 테이블

제2정규화 전)

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

 

단점)

- 예를 들어, 헬스의 가격이 7000원으로 오르면, 헬스인 행을 찾아 전부 6000원으로 변경해주어야 한다.
- 데이터가 많아진다면 골치가 아파지겠지..

 

-> 그렇기에 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업을 해준다.

가격 컬럼의 경우, 수강등록현황 주제와 별로 상관이 없다.
- 어떤 회원이 어떤 프로그램을 들었는지가 가장 메인 주제이다.

 

제2정규화 후)

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

 

 

추가)

Partial Dependency를 제거한 테이블
-> 제2정규형

Composite primary key
-> 컬럼끼리 합치면 pk(primary key) 역할을 해줄 수 있는 컬럼 조합
-> 2개 이상

pk는?
-> 각 행을 서로 구분하기 위한 unique한 컬럼 

 

그렇다면, partial dependency는?

-> 프로그램과 가격 컬럼처럼, composite primary key에만 종속되어 있는 컬럼


프로그램이 composite primary key라면, 가격 컬럼은 이에만 종속된 컬럼.
다른 컬럼과는 아무런 상관이 없기 때문에 부분 종속된 가격 컬럼을 다른 테이블로 빼준다.

 

 

제3정규화


일반 컬럼에만 종속되어 있는 컬럼 분리


제3정규화 전)

프로그램 가격 강사 출신대학
스쿼시초급 5000 김을용 서울대
헬스 6000 박덕팔 연세대
헬스 6000 이상구 고려대
골프초급 8000 이상구 고려대
개인피티 6000 박덕팔 연세대

 

-> 해당 테이블에는 Composite Primary key가 존재하지 않기에 제2정규화가 된 테이블이라고 규정

 

출신 대학 컬럼의 경우, 강사에만 종속되어 있고, 프로그램 및 가격과는 아무런 상관이 없음

-> 출신 대학 컬럼은 pk가 아닌 일반 컬럼이다.

이처럼 일반 컬럼에만 종속된 컬럼을 분리해주는 것을 제3정규형이라 한다.

 

제3정규화 후)

프로그램 가격 강사
스쿼시초급 5000 김을용
헬스 6000 박덕팔
헬스 6000 이상구
골프초급 8000 이상구
개인피티 6000 박덕팔
강사 출신대학
김을용 서울대
박덕팔 연세대
이상구 고려대

 

-> 만약 이상구라는 강사의 출신 대학을 수정해야 할 때, 뒤의 테이블의 하나의 행만 변경하면 완성된다.
(물론 join 하고 귀찮긴 하지만.. 귀찮으면 NoSQL..)

 

요약


제1정규화 -> 하나의 컬럼에는 하나의 값만 가져

제2정규화 -> 현재 테이블 주제와 관련없는 컬럼 분리해

제3정규화 -> 짜바리 컬럼에만 종속된 컬럼 분리해

'Database' 카테고리의 다른 글

[Database] 데이터(Data), 정보(Information)  (0) 2023.04.25
Comments