게시글번호 | 제목 | 내용 | 작성일 | 수정일 | 작성자 |
1 | javascript | javascript 는... | 2023.12.17 | 2024.01.02 | 이코드 |
2 | node | node 는... | 2023.12.18 | 2024.01.02 | 김코드 |
3 | react | react 는... | 2023.12.15 | 2024.01.02 | 이코드 |
4 | next | next 는... | 2023.12.19 | 2024.01.02 | 박코드 |
5 | python | python 은... | 2023.12.05 | 2024.01.02 | 이코드 |
이렇게 테이블이 존재할 때 이 코드라는 작성자가 구분이 가나요? 이 코드라는 사람은 동일인물일까요? 동명이인일까요?
게시글번호 | 제목 | 내용 | 작성일 | 수정일 | 작성자 | 생년월일 |
1 | javascript | javascript 는... | 2023.12.17 | 2024.01.02 | 이코드 | 00.12.25 |
2 | node | node 는... | 2023.12.18 | 2024.01.02 | 김코드 | 97.05.02 |
3 | react | react 는... | 2023.12.15 | 2024.01.02 | 이코드 | 92.10.23 |
4 | next | next 는... | 2023.12.19 | 2024.01.02 | 박코드 | 04.08.14 |
5 | python | python 은... | 2023.12.05 | 2024.01.02 | 이코드 | 00.12.25 |
이 테이블은 어떠한가요? 이 코드라는 작성자를 구분할 수 있나요?
만약에 이 테이블에서 00.12.25 생년월일을 가진 이 코드라는 사람의 생년월일이 잘못표기되어 바꾸어야 한다면 행마다 찾아가서 생년월일을 변경을 해야 할까요? 이 작업을 쉽게 할 수 있게 만들어주는 게 바로 RDBMS의 장점이라 할 수 있습니다. 그렇다면 테이블은 어떤 기준으로 분리를 해야 하는지 알아봅시다.
정규화
정규화란?
정규화라는 함수적 종속성 등의 종속성 이론을 이용하여 잘못 설계된 관계형 스키마를 더 작은 속성의 세트로 쪼개어 바람직한 스키마로 만들어가는 과정인데요. 쉽게 말해서 테이블 간의 중복을 막기 위해서 테이블을 분해하는 작업을 말합니다. 이때 분해를 어떻게 하는지에 따라서 정규화 단계가 달라지게 됩니다.
정규화의 목적
- 데이터 구조의 안정성과 무결성을 유지합니다.
- 어떤 관계라도 데이터베이스 내에서 표현이 가능해야 합니다.
- 데이터 중복을 배제하여 이상의 발생방지 및 자료 저장 공간의 최소화가 가능합니다.
- 데이터 삽입시에 관계를 재구성할 필요성을 줄입니다.
- 데이터 모형의 단순화가 가능합니다.
- 속성의 배열상태 검증이 가능합니다.
- 개체와 속성의 누락 여부 확인이 가능합니다.
- 자료 검색과 추출의 효율성을 추구합니다.
정규화의 원칙
하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어서는 안 됩니다. 또한 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜서 표현해야 합니다. 마지막으로 데이터의 중복성을 감소되어야 합니다.
정규화의 과정
제1 정규화
제1정규화는 테이블 칼럼의 값이 하나만 갖도록 테이블을 분리하는 것을 말합니다.
<변경 전>
가수 | 대표곡 |
aespa | black mamba, next level |
AKMU | 어떻게 이별까지 사랑하겠어 널 사랑하는 거지, 다리꼬지마 |
STAYC | ASAP, Teddy Bear |
태연 | 들리나요, 사계 |
<변경 후>
가수 | 대표곡 |
aespa | black mamba |
aespa | next level |
AKMU | 어떻게 이별까지 사랑하겠어 널 사랑하는 거지 |
AKMU | 다리꼬지마 |
STAYC | ASAP |
STAYC | Teddy Bear |
태연 | 들리나요 |
태연 | 사계 |
제2 정규화
제2 정규화는 제1정규화를 진행한 테이블에서 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하게 테이블을 분해하는 것을 말합니다.
<변경 전>
가수 | 노래 | 앨범 | 평점 |
AKMU | 후라이의 꿈 | Love Lee | 4.9 |
IVE | Off The Record | I'VE MINE | 4.6 |
AKMU | Love Lee | Love Lee | 4.9 |
태연 | 들리나요 | 베토벤 바이러스OST | 4.7 |
IVE | Baddie | I'VE MINE | 4.6 |
<변경 후>
가수 | 앨범 | 평점 |
AKMU | Love Lee | 4.9 |
IVE | I'VE MINE | 4.6 |
태연 | 베토벤 바이러스OST | 4.7 |
앨범 | 노래 |
Love Lee | 후라이의 꿈 |
Love Lee | Love Lee |
I'VE MINE | Off The Record |
I'VE MINE | Baddie |
베토벤 바이러스OST | 들리나요 |
위 테이블을 보면 가수와 앨범을 기본키로 가지며 평점은 가수와 앨범이 일치할 때 값을 받아오고 노래는 앨범만 존재해도 값을 받아올 수 있기 때문에 완전 함수적 종속인 평점은 가수 - 앨범 - 평점 테이블에 배치되고, 부분 함수적 종속은 앨범 - 노래로 테이블에 배치 되는 것입니다.
함수적 종속이란?
함수적 종속은 데이터들이 어떤 기준에 의해 종속되는 것을 말하는데요 예를 들어 수강 테이블에 학번, 이름, 과목명이라고 되어있을 때 학번이 결정되면 과목명에 상관없이 항상 같은 이름이 대응이 되게 되는데 이를 이름을 학번에 함수적 종속이라고 하며 학번→이름과 같이 사용할 수 있습니다.
완전 함수적 종속과 부분 함수적 종속이 존재하는데요
기준은 항상 기본키에 의해서 정해지게 됩니다. 예를 들어볼까요? 학번, 과목명, 성적, 학년이 적힌 테이블이 존재합니다. 이때 기본키는 학번과 과목명으로 성적은 학번과 과목명에 의해서 성적이 정해지는 반면에 학년의 경우에는 학번만 존재해도 학년이 결정이 됩니다. 즉 기본키에 전부 영향을 받으면 완전 함수적 종속, 일부에만 영향을 받으면 부분 함수적 종속이 되게 됩니다.
제3 정규형
제3 정규형은 제2 정규형이 진행된 테이블에서 이행적 종속을 제거하여 테이블을 분해하는 것을 말합니다.
<변경 전>
구매자 | 앨범 | 앨범 가격 |
코드둥 | Love Lee | 15,000 |
김코드 | 베토벤 바이러스OST | 13,000 |
이코드 | Love Lee | 15,000 |
박코드 | I'VE MINE | 18,000 |
<변경 후>
구매자 | 앨범 |
코드둥 | Love Lee |
김코드 | 베토벤 바이러스OST |
이코드 | Love Lee |
박코드 | I'VE MINE |
앨범 | 앨범 가격 |
Love Lee | 15,000 |
I'VE MINE | 18,000 |
베토벤 바이러스OST | 13,000 |
변경 전 테이블을 확인하면 구매자가 앨범을 결정 (A→B) 하고 앨범은 앨범의 가격을 결정 (B→C) 하는 것을 알 수 있는데요 이때 구매자가 내야 할 앨범가격을 결정하게 됩니다.(A→C)
이행적 종속이란?
A→B, B→C가 성립할 때 A→C가 성립되는 것을 말합니다.
BCNF 정규화 (Boyce-Codd Normal Form)
BCNF 정규화는 제3정규화를 진행한 테이블에서 결정자이면서 후보키인 것을 분리하는 것을 말하는데요 제3정규화에서 후보키가 여러 개 존재할 때 서로 중첩되는 경우에 적용하는 강한 제3 정규형이라고도 합니다. 결정자는 속성 간의 종속정을 규명할 때 기준이 되는 값을 말하며 종속자는 결정자에 의해 정해지는 값을 의미합니다.
<변경 전>
멤버 | 가수 | 소속사 |
시은 | STAYC | 하이업 |
카리나 | aespa | SM |
윈터 | aespa | SM |
안유진 | IVE | 스타쉽 |
장원영 | IVE | 스타쉽 |
<변경 후>
멤버 | 소속사 |
시은 | 하이업 |
윈터 | SM |
카리나 | SM |
안유진 | 스타쉽 |
장원영 | 스타쉽 |
가수 | 소속사 |
STAYC | 하이업 |
aespa | SM |
IVE | 스타쉽 |
멤버와 가수로 소속사를 판별하고 소속사는 가수를 결정할 수 있는데요. 이때 소속사는 후보키가 아님에도 가수를 결정할수 있기 때문에 결정자에 속하게 됩니다. 때문에 결정자는 항상 후보키가 되도록 테이블을 분해해주어야 합니다. 분해를 하면 BCNF를 만족하게 되는 것입니다.
'데이터베이스' 카테고리의 다른 글
[SQL] timezone 수정하기 (0) | 2023.12.20 |
---|---|
DATABASE의 제약조건 (NOT NULL과 DEFAULT) (0) | 2023.12.19 |
[SQL] 날짜/시간 타입 (0) | 2023.12.19 |
DATABASE의 KEY (0) | 2023.12.18 |
RDBMS vs NoSQL (0) | 2023.12.18 |