본문 바로가기
컴퓨터공학/데이터베이스(database)

정규화

by 바코94 2024. 6. 21.

 

학번 과목코드 성명 과목명 평가코드
101 CR03 박영진 공업수학 C
101 CR11 박영진 심리학개론 A
103 CR11 김영희 심리학개론 B
103 CR15 김영희 논리학개론 F

[학생들의 수강 과목과 평과 결과 표]가 있다. 
박영진이라는 학생과 김영희라는 학생이 있다.
박영진 학생은 공업수학, 심리학개론 수업을 듣고 C,A 평가를 받았다. 
김영희 학생은 심리학개론, 논리학개론 수업을 듣고 B,F 평가를 받았다.
과목은 공업수학(CR03), 심리학개론(CR11), 논리학개론(CR15)가 있다.


이런 표가 실제로 있다면 데이터를 관리하는데 있어 문제가 있을까? 있다면 어떤 문제가 발생할까?

경우1) 과목 이름을 '심리학개론'에서 '심리학입문' 으로 변경해야 할 때.
과목코드가 CR11인 행을 모두 찾아서 심리학개론을 수정해주어야한다.
데이터가 10억개 정도 있다고 생각하면 끔찍하다. 모든 행을 다 바꾸는 것이 맞나 싶다.
혹시나 일부 누락하는 실수를 생기는 날에는 '심리학개론'과 '심리학입문'이 혼재되게 된다. 동일한 과목코드인데 과목명이 다르다. 
동료가 와서 이 데이터를 본다면 여러 과목명을 가지는 것을 의도한 것인지 아닌지 알길이 없다. 그리고 내가 수정했는데 잊고 있다가 한참 뒤에 발견한다면, 의도해서 이렇게 한건지 아닌지 헷갈린다.

경우2) 김영희의 논리학개론 평가 결과를 삭제할 때.
논리학개론 과목이 테이블에서 사라진다. 논리학개론 과목(CR15) 이 있다는 정보 자체가 없어진다. 

이런 문제가 얼마나 심각할까?
이 문제를 어떻게 개선할 수 있을까? 
왜 이런 문제가 발생할까?

데이터에 이상이 존재한다면 더 이상 데이터를 신뢰하기 어려워진다. 앞서 이야기한 경우1처럼 과목코드 하나에 과목명을 2개 이상 둔다는 비즈니스 규칙이 의도치않게 생길 수 있으며, 이런 부분들에 대해 의문을 가지고 항상 물어봐야한다. 즉, 의도한 것인지 아닌지를 매번 체크하고 신뢰하지 못하는 것이 굉장한 비용을 불러 일으킨다. 
또한, 경우 1의 경우에 심리학입문 평가 데이터가 10억개 정도 있다면 서비스 성능 이슈가 생길 수도 있으니 매우 조심스럽게 업데이트를 해야한다. 한 번에 업데이트하는게 얼만큼의 부하를 주는지 예측하고 이게 가능한지, 장애가 생길 수는 없는지 등 고려사항들이 한 두가지가 아니다.
나비 효과처럼 조금 문제가 있는 것일 뿐인데, 여파가 만만치가 않다. 어떻게 해야할까?

위에서 현상이 생기는 원인은 두 가지로 볼 수 있는데
하나는 데이터가 중복으로 관리되기 때문인데, 이는 데이터 간의 종속성이 있기 때문이며
다른 하나는 데이터가 독립적으로 관리되지 않기 때문이다.

종속성이 무엇인지 살펴보자. 예를 들면, 과목코드를 알면 과목명을 알 수 있다. CR11이라는 과목 코드는 심리학 개론을 지칭한다. 이 때 '과목코드' -> '과목명' 으로의 종속성이 있다고 표현한다. 즉, 어떤 속성을 알면 다른 속성을 알 수 있는 것이다.

데이터가 독립적이지 않다는 것은 예를 들면, 과목이라는 개념과 학생의 수강평가라는 개념이 혼재되어 있어 있기 때문이다. 과목, 학생, 수강평가 라는 개념은 관점에 따라 독립적으로 다룰 수 있는 것이다.

데이터 중복이 생기는 원인이 종속성 때문이라 했으니, 이 종속성을 제거한다면 중복이 사라질까?
'과목코드'를 알면 '과목명'을 알 수 있다. 따라서, 이 종속성을 별도의 테이블로 분리할 수 있다. 

학번 과목코드 성명 평가코드
101 CR03 박영진 C
101 CR11 박영진 A
103 CR11 김영희 B
103 CR15 김영희 F

[학생 수강평가 표]

과목코드 과목명
CR03 공업수학
CR11 심리학개론
CR15 논리학개론

[과목 표]
위처럼 분리하면 앞서 이야기한 '심리학개론'을 '심리학입문'으로 과목명을 변경하는 것에서 문제가 생기지 않는다.

또한, '학번'을 알면 '성명'을 알 수 있으니 학번->성명 으로의 종속성도 별도 테이블로 분리해보자.

학번 과목코드 평가코드
101 CR03 C
101 CR11 A
103 CR11 B
103 CR15 F

[학생 수강평가 표]

학번 성명
101 박영진
103 김영희

[학생 표]

과목코드 과목명
CR03 공업수학
CR11 심리학개론
CR15 논리학개론

[과목 표]

이렇게 세 개의 표로 나뉘어 지면서 '김영희'가 개명이라도 하는 날에는 깔끔하게 학생 표에서만 수정해주면 된다. 학생 평가 데이터가 10억개인 것은 상관없이 과목명만 간단히 수정해주면 과목명 변경이 끝난다. 앞서 생겼던 이슈들이 말끔히 해결되었따.

위 과정을 거쳐 데이터의 이상이 없는 정규화된 표가 결과적으로 되었다. 중요한 것은 독립된 데이터들은 별도의 테이블로 관리해야 하며, 종속성을 제거하는 것으로 데이터 관리가 무결해진다는 것이다.

이처럼 속성들의 종속성을 찾아서 별도의 표로 빼내고 독립된 데이터를 별도로 관리하는 것을 통해 데이터를 이상없이 관리할 수 있게 된다. 즉, 정규화한다는 것은 종속성을 제거하고 독립된 데이터를 별도로 관리하는 것이다.