관계형 데이터베이스 설계시 데이터의 중복이 발생하면 이상 현상(삽입 이상, 삭제 이상, 갱신 이상)이 발생하게 됩니다. 따라서 이 데이터 중복을 최소한으로 줄여 이상 현상 발생을 줄이게 되는데 이때 수행하는 것이 정규화(Normalization)라고 합니다.
정처기 공부시 기본 cs나 데이터베이스 경험이 없다면 한번쯤 발목 잡힐 부분이라 이 기회에 쉽게 정리해보기로!
따라서 정처기 외에 CS를 공부하시는 분이라면 뒤로가기 버튼을 눌러주세요~
1NF (1정규형)
1 정규형은 원자값으로 구성 되어야 합니다.
여기서 말하는 원자는 고등학교 화학에서 한 번쯤 들어봤을 만한 화학적 성질에서 이야기하는 원자를 생각하면 쉬워요
더 이상 분해될 수 없고 쪼갤 수 없는 값을 말합니다.
즉 테이블에서 행과 열 중 열의 값을 고유 원자값으로 표현해 주면 됩니다.
쉽게 말해서 셀(테이블에서 하나의 네모 박스)에 단 한개의 값만 들어 있으면 되는 거죠!
이름 | 과목 |
김고양 | 데이터베이스, 운영체제 |
김멍멍 | 운영체제, 자료구조 |
위 테이블에서 과목'열'을 보면 각각의 셀이
-> 데이터베이스, 운영체제
-> 운영체제, 자료구조
이렇게 여러개의 값이 들어 있는 것을 알 수 있어요
이 값들은 쪼갤 수 있는 즉 원자값이 아니므로 아래와 같이 원자값으로 표현해 주면 1정규형을 만족하게 됩니다.
이름 | 과목 |
김고양 | 데이터베이스 |
김고양 | 운영체제 |
김멍멍 | 운영체제 |
김멍멍 | 자료구조 |
그렇다면 왜 이렇게 쪼개 주는 걸까요?
데이터베이스 관점이 아닌 사람의 눈높이에서 보면 1정규형을 해주지 않아도 나름 괜찮아 보일 수도 있어요
이름으로 바로 그 학생이 듣는 모든 과목을 조회할 수 있으니까.
하지만 이를 관계형 데이터베이스화 할때는 이야기가 달라집니다.
데이터베이스라는 과목에도 수강료, 강사 등 수 많은 속성들이 존재 할 수 있고
이 속성들을 조회하려면 한 셀에 '데이터베이스, 운영체제' 이렇게 들어 있어서는 조회가 불가능합니다
(운영체제에 관련 없는 데이터베이스 과목 속성들을 이어주면 이상 현상 보다 더 심각한 문제가 생길 수 있다)
정리 : 1정규형은 한 셀에 하나의 값만 넣어주겠다!
2NF (2정규형)
2정규형은 부분함수 종속을 제거하여 중복을 줄여주는 정규화를 의미합니다.
말이 어렵지만 여기서 부분함수에 종속되지 않게 만들겠다! 이렇게만 이해해 두고 더 공부해봅시다
다른 행과 행을 구분해 주는 기본키는
하나 혹은 그 이상으로 구성됩니다
문제에서는 주로 첫 번째 행에서 밑줄로 그어진 것이 기본키입니다
아래 테이블을 보면
사용자id | 코스명 | 수강료 |
1 | 십자수 | 100000 |
1 | 골프 | 400000 |
2 | 십자수 | 100000 |
3 | 축구 | 200000 |
사용자 id 와 코스명이 복합으로 기본키로 사용되고 있습니다
사용자 id + 코스명이
다른 행과 행의 차이를 구분해 주기 때문입니다
그런데 여기서 잘 보면 수강료는 사용자 id와 관계 없이 코스명만 따르고 있는 것을 볼 수 있습니다.
그렇기 때문에 아래와 같이
사용자 id | 코스명 |
1 | 십자수 |
1 | 골프 |
2 | 십자수 |
3 | 축구 |
코스명 | 수강료 |
십자수 | 100000 |
골프 | 400000 |
축구 | 200000 |
두 개의 테이블로 나누어 주어도 데이터를 조회하는데 문제가 생기지 않아요
사용자 아이디로 코스명을 찾고 그 코스명으로 수강료를 조회할 수 있습니다
그렇기 때문에 기본키가 여러 속성으로 구성되어 있고
그 기본키 외의 속성이 그 기본키의 일부에만 관련이 있다면
이렇게 테이블을 나누어 줄 수 있고
이 경우를 부분 함수 종속 제거 혹은 완전함수 종속 관계라고 합니다
따라서 부분 함수! 라고 한다면 기본 키 중 일부분에 속하고 있는 경우
완전 함수라고 한다면 기본키 외의 속성이 기본키 일부분이 아닌 완전히 관련있는 경우
이렇게 생각하시면 쉬워요
정리하자면
밑줄 그어진 여러 속성으로 이루어진 기본키 중
기본키가 아닌 다른 속성이 기본키의 일부하고만 관련(종속)있다면 이를 분리한다!
3NF (3정규형)
3정규형은 이행함수 종속을 제거해야 합니다
여기 세개의 속성이 있다고 합시다
A, B, C
이때 A -> B, B -> C 일때 이행 함수 종속이라고 합니다
쉽게 말해서 A 속성이 B와 관련되어 있고 B 속성이 C와 관련 있을 때를 말합니다
id | 모델명 | 회사명 | 연락처 |
1 | APhone | 감자 | 02)0000-0000 |
2 | GoodPhone | 감자 | 02)0000-0000 |
3 | cellPhone | 참치 | 02)1111-1111 |
4 | WowPhone | 고구마 | 02)1234-1234 |
이 테이블을 보면 id로 회사명을 조회할 수 있고 회사명으로 연락처를 조회할 수 있습니다
여기서 만약 3차 정규화를 하지 않으면 어떻게 될까로 접근해 봅시다
id -> 회사명 -> 연락처 로 이행 함수 종속 되어 있고
이때 새로운 행을 추가해 id 는 5 모델명은 APhone, 회사명은 감자라고 할때
사용자가 감자 회사의 연락처를 같이 입력해 줘야 합니다
만약 입력해 주지 않으면 위 테이블은 삽입 이상이 일어납니다.
따라서 위 테이블을 아래와 같이 분리해 보면
id | 모델명 | 회사명 |
1 | APhone | 감자 |
2 | GoodPhone | 감자 |
3 | cellPhone | 참치 |
4 | WowPhone | 고구마 |
회사명 | 연락처 |
감자 | 02)0000-0000 |
참치 | 02)1111-1111 |
고구마 | 02)1234-1234 |
이렇게 되기 때문에 앞에 테이블에서 새로운 모델과 회사를 입력하더라도 연착처를 다시 입력하지 않아도 됩니다
그렇기 때문에 A -> B -> C 처럼 관계 가 있는 이행 함수를
A -> B , B -> C 로 해서 이행 함수 종속을 제거할 수 있어요
참고 사이트 :
jerryjerryjerry.tistory.com/49
www.youtube.com/watch?v=J-drts33N8g
혹시 틀리거나 이상한 점이 있다면 댓글로 알려주세요 🙏
'NSLog(@"%@", dailyLog)' 카테고리의 다른 글
드디어 몬터레이 업그레이드 했다 (0) | 2022.02.20 |
---|---|
갑자기 맥북 인터넷 안될때(와이파이 지웠다 깔았는데도 안된다면 !) (0) | 2020.11.30 |
[Android] 카드뷰 레이아웃 에러 or Refactor > Migrate to AndroidX (0) | 2020.08.26 |
[Android] 안드로이드 구성 요소 (0) | 2020.08.17 |
[Android, Kotlin] 데이터 클래스와 기타 클래스 (0) | 2020.08.09 |
댓글