광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

정규식과는 아무 상관 없다. 정규식은 레귤러 익스프레션(정규표현식)이고 얘는 노말라이제이션임.


정규화의 필요성-이상현상

정규화의 목적은 이상현상을 막기 위한 것이다. 이상현상에는 크게 삽입이상, 삭제이상, 갱신이상이 있는데 이게 뭐냐...

 

1. 삽입이상: 데이터베이스에 뭘 추가하고 싶은데 쓰잘데기 없는 TMI까지 같이 추가해야 한다. 예를 들어보자. 요즘 집에 집전화 있는 사람 있어요? 다들 1인 1폰이라 집전화 없잖음. 일단 우리집은 없는데… 그럼에도 불구하고 아주 오래된 회원가입 양식 중에는 집전화, 핸드폰 둘 다 써야 하는 경우가 있었다. 지금은 거의 없겠지만… 그럼 생각해봐요. 나는 여기 가입을 해서 서비스를 이용해야 하는데, 없는 집전화번호까지 입력하라고? 이렇게 얘기하면 아니 그럼 NULL때리면 안되나요? 라고 할 수도 있는데, NOT NULL 걸려있으면 어쩔겨?

2. 삭제이상: 나는 얘만 지우고 싶은데 얘를 지우면 다른게 줄줄이 지워진다. 이거를 나는 대가족에 비유했는데, 식구들이 많다보니 내 물건을 버리려다가 남의 물건까지 같이 버리게 되는 초유의 사태가 일어날 수도 있다는 것... 쉽게 말하자면 이것만 지우고 싶은데, 이걸 지우면 스플뎀으로 남겨둬야 하는 것까지 같이 지워진다 이거다.

3. 갱신이상: 한쪽에서는 바꼈는데 다른쪽에서는 그대로인 경우. 예를 들어보자. 여러분이 월급통장을 KB껄로 쓰다가 우리은행으로 갈아탔고 KB껀 아예 해지를 했어요. 그리고 회사에도 월급통장 바꼈다고 얘기했는데 아직도 회사 DB에 KB 은행 계좌가 남아있어서 월급이 안들어와. 인사팀에서도 없는 계좌라고 이체가 안돼. 엥? 이게 뭔 상황이죠? 한쪽에서는 내 월급통장 계좌를 제대로 바꿨는데, 다른 DB에서 이게 반영이 안 된 상황이다.

 

이런 초유의 사태를 막기 위해 정규화를 해야 하는 것이다. 아, 근데 정규화에 대해 설명하기 전에 한가지 더 알아두고 가셔야 할 게 있다.


함수적 종속성

일단 비전공자인 본인피셜(본인 생물학 전공자임) 듣자마자 개념을 외우주로 보내버릴 것 같았음. 이때는 대략 정신이 멍해진다.

 

함수는 입력을 하나 주면 출력을 하나 내놓는다. y=x²는 x가 1일때 y가 1, x가 2일때 y가 4 뭐 이런 식으로 하나만 주잖아요? 그런 식으로 얘로 쟤를 하나만 찝을 수 있으면 함수적 종속성을 갖는다고 한다. 그러니까 이름은 함수적 종속성을 가질 수가 없다. 왜죠? 동명이인이 있잖아요. 대신에 생년월일과 함께라면 함수적 종속성을 가질 수도 있다. 왜죠? 동명이인이라고 생년월일까지 같겠수?

 

근데 얘가 왜 갑자기 나오냐고? 2, 3차 정규화에 나옵니다.


정규화

NF라고 하는데 1NF -> 2NF -> 3NF -> BCNF -> 4NF -> 5NF 순서대로 1, 2, 3차->보이스-코드 정규화->4, 5차다. 근데 BC부터는 딱히 알 필요는 없고... 보통은 3차선에서 끝나니까 우리도 일단은 3차까지만 알아두자.

 

일단 각 정규화는 순차적으로 진행되기때문에 각 정규화의 앞 단계가 선행되어야 한다. 뭔 소리냐고? 3차 할거면 2차를 마친 테이블이 있어야 한다 이 얘기. 피츄 있다고 바로 라이츄 못 만든다. 가릿? 

 

제 1차 정규화

모든 속성이 원자값을 갖도록 한다. 

 

이게 뭔 소리냐면 한 칼럼에는 하나의 값만 있어야 한다. 포켓몬의 특성은 최소 하나이고 최대 셋인데(메진하면 더 많아질수도 있음), 이걸 한 칼럼에 때려박았다고 생각해보자. 그러면 특성이 프레셔인 포켓몬을 찾으려면 REGEXP나 LIKE가 필요하겠죠? 예를 들어서 라이츄의 특성은 정전기와 피뢰침인데(메가라이츄 특성은 아직…), 이걸 한 칼럼에 정전기, 피뢰침 이렇게 두는 게 아니라 칼럼 자체를 특성 1, 특성 2, 숨겨진 특성, 메가진화 특성으로 나눈다는 얘기다.

 

제 2차 정규화

부분함수 종속을 제거한다. 다르게 말하자면 모든 칼럼들이 기본키에 완전 함수 종속이어야 한다.

 

그니까 여기서 저 빨간색이 부분함수 종속이다. 보통은 PK가 두 개 이상일 때 여기에 대해 논하는데… 이 문장까지만 대충 보신 분들은 이제 'PK가 두 개 이상이면 무조건 부분함수 종속이구나!'라고 오해하실 수 있는데, 그게 아니다. PK가 두 개 이상 있어야 하나를 찝어낼 수 있는 경우도 있다. 포켓몬 도감의 경우 도감번호만으로 특정 포켓몬 하나를 찝어낼 수가 없기 때문.

 

예? 25번 피카츄 하나잖아요. 그래서 그 피카츄가 1) 그냥 피카츄예요 2) 렛츠고 시리즈의 파트너 피카츄예요 3) 옷갈아입기 피카츄예요 4) 거다맥 피카츄예요? 이 폼들까지 세분화해서 찝어내려면 다른 식별자가 같이 PK 역할을 해 줘야 한다. 그럼 다른 예시를 들어보자. 전국도감 6번은 리자몽인데, 이것만 갖고 1) 리자몽 2) 거다맥 3) 엑자몽(메진 X) 4) 와자몽(메진 Y)중 하나를 찝어낼 수 있을까? 도감 번호랑 같이 어떤 식별자가 따라와야 리자몽들 중에서 특정 리자몽을 찝어낼 수 있다.

 

그러니까 여기서 여러분들이 아셔야 할 건, PK가 두개라고 해서 무조건 부분 함수 종속이 아니라는거다. PK가 두개여야만 유일한 하나를 찝어낼 수 있다면 그건 완전 함수 종속이다. 부분 함수 종속은 말 그대로 사족이다. 예를 들어서 학생과 과목코드를 PK로 갖는 데이터베이스에서 과목코드-교수명이라는 종속관계가 생긴다면? 이건 테이블 째야된다.

 

제 3차 정규화

이행함수 종속을 제거한다. 이행함수 종속이 뭔데요? 위 그림에서 초록색 선이다. 저기 그림에 빨간 선은 A, B에서 뻗어나온 화살표이고, 초록색은 뜬금없이 F에서 뻗어나온건데… A, B에 열쇠 기호 있는 거 보이시죠? PK 표시다. 이행함수 종속은 PK도 아닌 놈이 다른 놈이랑 함수적 종속관계를 갖는 게 이행함수 종속이다.

강의 들으면서 정리한 표인데 보고가십셔.


반대 개념도 있나요?

결론부터 말하자면 있다. 반정규화라고 있는데 이건 취급이 거의 뭐 익스터미나투스급이다.

반응형

'Coding > 코딩잡담' 카테고리의 다른 글

속성과 관계  (0) 2025.11.11
반정규화  (0) 2025.11.11
조인들이 모였네  (0) 2025.11.10
엔터티  (0) 2025.11.10
서브쿼리  (0) 2025.11.05