- 청소 플랫폼 만들기
- RDBMS의 정규화
참조한 사이트
이때까지 팀 프로젝트를 할때 기본 뼈대와 예시코드를 공유하면 좋을 거라고 생각했는데 반대였던 것같다.
오히려 자기가 평소에 만들던 것과 너무 달라서 평소에 오류가 안터진곳에서도 에러가 터져서 사실상 에러가 안터진 곳이 없다.
내가 새벽까지 고친걸 자고 일어나니 다른 팀원도 새벽에 고치고 있었고 그런 식이었다.
그걸 하나로 합친 뒤에도 똑같이 하나 고칠때마다 새로운 버그가 생겨서 곤란하였다. 코드 스타일을 통일하는게 오히려 쉬울줄 알았는데, 반대로 그맡믄 유연하게 코드를 읽고 짤 수 있어야 가능했던 것같다.
내가 아는 것
정규화란? : RDBMS를 짤때 중복을 최소화하는 데이터 구조를 만드는 것이다.
1~5단계로 이루어져있으며, 3단계 이상으로는 잘 가지 않는다고 한다.
해야하는 이유 : 학생의 정보에 담임 선생님이 있다고 치자, 아직 아무런 학생도 담당하지 않는 새로운 선생님이 들어왔다고 한다면 선생님의 존재를 DB에 넣을 수 없는 문제가 생긴다. 반대로 한명의 학생만 담당하는 선생님이 있다면, 그 학생을 지우거나 수정하면, 선생님이 DB에서 사라지게 된다.
정규화의 장점 : 위에서 말한 문제를 해결한다. = 무결성을 보장한다.
DB의 중복이 없어지므로 용량이 감소한다.
정규화의 단점 : 정규화의 단계가 올라갈 수 록 DB에서 정보를 읽기 위해서 join을 많이해야하기 때문에 읽고 쓰는 속도가 느려진다.
팀에서 정리한 것
정규화(正規化, normalization)란 어떤 대상을 일정한 규칙이나 기준에 따르는 '정규적인' 상태로 바꾸거나, 비정상적인 대상을 정상적으로 되돌리는 과정을 뜻한다.
RDBMS(관계형 데이터베이스 관리 시스템)에서의 정규화는 중복을 최소화하고 데이터의 일관성과 무결성을 유지하는 것이 목적이며, 주로 업데이트와 삭제의 이상 현상을 방지하고 효율적인 데이터 저장과 조회를 가능하게 한다.
정규화는 여섯 단계로 나뉜다.
제1정규화 - 각 속성(컬럼)이 원자값(atomic value, 하나의 값)을 갖도록 테이블을 분리한다.
예를 들어 '주문' 테이블에 데이터가 (orderId: 1 / Product: Laptop, Smartphone, Keyboard / Quantity: 2, 1, 3 / price: 800)과 같이 존재한다면, 이를 각 컬럼에 하나의 값만 존재하도록 나눈다. (orderId: 1 / Product: Laptop / Quantity: 2 / price: 800)
제2정규화 - 부분 종속 제거
제1정규형을 만족한 상태에서, 부분 종속성을 제거하여 완전 종속을 만족하도록 한다.
부분 종속이란 테이블 내의 기본키로 사용할 수 있는 속성이 2개 이상인 경우이며, 이들을 복합키라고 부른다.
완전 종속이란 기본키로 사용할 수 있는 속성이 단 하나이며 나머지 속성들이 기본키에 종속됨을 말한다.
예를 들어 '주문' 테이블에는 orderId, ProductId, customerId 등 외래키가 아니면서 기본키로 사용할 수 있는 속성들이 존재하지 않도록 여러 테이블로 나누어준다.
제3정규화 - 이행적 종속성 제거
제2정규형을 만족한 상태에서, 이행적 종속을 없애도록 테이블을 분리한다.
이행적 종속은 A -> B, B -> C가 성립될 때 A -> C도 성림됨을 뜻한다.
예를 들어 '강의'라는 테이블에 '학생 ID', '강의 번호', '강사', '강사 연락처'라는 속성들이 존재한다고 했을때, 속성 '강사'는 속성 '강의 번호'에 종속되고, 속성 '강사 연착처' 또한 속성 '강의 번호'에 종속되게 된다.
이러한 일이 일어나지 않도록 테이블을 '강의', '강사' 등으로 나눈다.
BCNF(Boyce-Codd 정규화) - 결정자이면서 후보키가 아닌 것 제거
보이스 코드 정규화는 제3정규형을 만족한 상태에서, 모든 결정자가 후보키가 되도록 테이블을 분해한다.
결정자(Determinant)는 테이블 내에서 다른 속성들의 값을 결정하는 속성을 말한다. 어떠한 속성이 다른 속성에 종속되어 있다고 할 때 그 종속되는 속성이 결정자가 된다. (ex. 학생 정보 테이블에서 강의 번호가 해당 강의를 담당하는 교수의 이름을 결정한다면, 강의 번호가 결정자가 된다.)
후보키(Candidate Key)는 테이블 내에서 각 행을 유일하게 식별할 수 있는 열(속성)들의 조합을 말한다. (ex. 학생 정보 테이블에서 학번과 주민등록번호가 모두 고유하게 식별할 수 있는 속성들이라면, 이 두 속성의 조합이 후보키가 될수 있다.)
제4정규화 - 다치 종속성 제거
제3정규형과 BCNF를 만족한 상태에서, 같은 테이블 내의 다른 후보키로부터의 종속성을 제거한다.
다치는 다중값, 값이 여러개라는 의미이다.
하나의 행(row)에 나열된 속성들은 서로 관련이 있어야 한다.
예를 들어 manageId, employee, license, language라는 속성들을 가진 테이블이 있다고 하자. 여기서 직원 A는 정보처리산업기사라는 자격증 보유하고 있으며 프로그래밍 언어 javascript를 다룰수 있다. 이후 직원 A가 프로그래밍 언어 typescript를 다룰 수 있게되어 DB를 갱신하려고 하나, 데이터를 추가하기 위해서는 자격증에 관한 내용도 등록하여야만 한다.
또 다른 경우 직원 B가 가지고 있던 어떠한 자격증이 만료되어 관리 테이블에서 삭제하여야하는데, 이럴 경우 직원 B가 다룰 수 있는 언어에 대한 내용도 제거하여야만 한다.
이러한 경우를 다치 종속성이라고 하며, 이를 제거하는 것이 제4정규화이다.
제5정규화 - 조인 종속성을 제거
PJNF(프로젝션 정규형)이라고도 한다.
제4정규형을 만족한 상태에서, 다른 테이블 간의 종속성을 제거한다.
예를 들어 A 테이블과 B 테이블을 join 했을때 그 결과가 A 테이블에 있던 속성값이과 B 테이블에 있던 속성값이 반복되어서 나오는 경우를 조인 종속성이 있다고 표현한다.
이러한 일이 일어나지 않도록 A 테이블과 B 테이블을 A, B, C, D... 등 최소한의 기본키와 최소한의 컬럼을 가지도록 잘게 쪼개다.
이렇듯 정규화 과정을 통해 데이터의 중복과 일관성, 무결성을 유지하고 수정 삭제 시의 이상 현상을 방지할 수 있다는 장점이 존재하지만 너무 과도한 정규화는 복잡성을 증가시키고 참조해야하는 테이블이 늘어남에 따라 연산시간도 길어져 성능이 저하될 수 있다는 단점 또한 존재한다.
[Database] 정규화(Normalization) 쉽게 이해하기
RDBMS 정규화(Normalization) - 1/2