DB 정규화 (이상 현상 편)

갈아만든배·2023년 5월 23일
0
post-thumbnail

데이터베이스 정규화에 대해 알아보자.

그래서 정규화가 뭔데?

데이터베이스 정규화란 관계형 데이터베이스 사용을 위해 테이블의 구조를 설계하거나 혹은 기존에 사용하던 테이블의 데이터가 방대해져 테이블을 세분화할 때 데이터 간의 중복을 최소화하게 데이터를 구조화하는 프로세스이다.

초기에 구상했던 것과는 달리 데이터베이스에 저장되는 데이터가 점차 방대해지고 서비스를 확장시키면서 점차 추가되어는 데이터들 사이에 중복이 발생하거나 편의를 위해 같은 데이터를 다른 테이블에 중복으로 저장하는 일이 발생하는데,

이 때 데이터베이스 정규화를 진행하여 데이터 간의 중복을 줄이고 테이블의 구조를 논리적으로 구성하여 데이터베이스를 구조화 하는 것을 정규화라고 부른다.

정규화의 형태는 1~6단계의 정규형 + BCNF 정규형이 존재하며, 보편적으로는 6단계 까지 정규화를 진행하는 것은 아니고 3정규화 이후 BCNF 정규화까지 적용되었으면 데이터베이스가 정규화 되었다고 말한다.

(실무에서는 4~6 단계 정규화는 정규화를 진행하는 도중에 관계가 오히려 너무 많아져 관리가 힘들어지므로 하지 않는다고 한다.)

정규화를 왜 해야 하는데?

초기에 정규화를 고려하여 데이터베이스를 설계한 것이 아니라면,

요구 사항이 늘어나거나 서비스를 확장해 나가면서 추가되는 부분들 때문에 초기 의도와는 달리 같은 테이블 내에 중복된 정보를 저장하거나,
서로 다른 테이블 사이에 동일한 정보를 저장해야만 하는 상황이 발생할 수 있다.

이 때 해당 정보를 테이블과 분리하거나 중복된 데이터를 제거한다면 해당 데이터 만큼의 저장 공간을 확보할 수 있고,
중복된 값이 제거되어 전체적인 테이블 내의 데이터가 줄어드므로 해당 테이블을 조회할 때의 검색 속도 또한 증가되는 효과를 가져올 수 있다.

또한 불필요한 중복 값이 사라지고 테이블 간에 데이터 연관성이 사라진다면,

데이터베이스 내의 정보들을 좀 더 논리적인 구조로 관리할 수 있고 추후에 또 발생할지 모를 추가 사항에 대해 좀 더 유연하게 대처할 수 있게되어 유지보수 또한 용이해지게 된다.

정규화가 나오게된 과정 설명.

데이터베이스 정규화라는 개념을 이해하기 위해서는 먼저 데이터베이스 이상 현상에 대해 정리하고 넘어가야만 한다.

사실 정규화라는 개념 자체가 이러한 이상 현상들을 해결할 수 있는 방법론에 가깝기 때문이다.

데이터베이스 이상 현상은 크게 3가지로 나뉘는데,

  • 갱신 이상 (Modification Anomaly)

  • 삽입 이상 (Insertion Anomaly)

  • 삭제 이상 (Deletion Anomaly)

이 있다.

먼저 갱신 이상 이란,

말 그대로 데이터베이스 내의 정보를 갱신할 때 이상 현상이 발생하는 것을 말하는데,

이는 데이터베이스 내부에 중복된 값이 저장되어 있어서 중복된 데이터를 전부 동일한 값으로 바꿔주지 않을 경우에 데이터에 대해 일관성을 해치게 되는 문제가 발생한다.

예시를 들어보자.

정규화를 진행하지 않은 학생 정보 데이터베이스가 있다고 가정해보자.

해당 데이터베이스 내부에는 학생 이름, 학년, 주소, 학생이 듣고 있는 수업 명의 정보를 포함하고 있다.

학생 정보에 해당하는 이름, 학년, 주소는 학생이 듣고 있는 수업 명의 정보가 바뀔 때 마다 모두 다 같은 정보를 저장해준다.

위와 같은 가정에서 만약 학생이 이사를 가게 된다면 어떻게 될까?

학생의 주소가 변경되었기 때문에 학생 정보를 포함하고 있는 모든 데이터를 조회해서 일일이 변경된 주소로 정보를 수정해 주어야 할 것이다.

이 때 혹시라도 데이터 하나가 누락되어 수정이 진행되지 않았다면?

이 경우에 학생의 주소 정보에 대한 일관성이 깨지게 된다.

이를 해결하기 위해서는 학생 테이블과 수업 테이블을 분리하도록 정규화를 진행해야 한다.

갱신 이상을 해결하기 위해 정규화를 진행하여 학생 테이블과 수업 테이블을 분리하였다.

이제 학생 테이블의 학생 정보가 바뀌어도 해당 학생에 대한 수업 정보는 연관성을 가지지 않게 되므로 학생 정보에 대한 일관성을 유지할 수 있게 되었다.


삽입 이상 이란,

말 그대로 데이터베이스에 INSERT 중 발생하는 이상 현상을 말한다.

삽입 이상 또한 위에서 설명했던 학생 테이블을 통해 예시를 들어보자.

또 다시, 정규화가 진행되지 않은 학생 테이블이 있다고 가정해보도록 하자.

해당 데이터베이스에는 이번엔 수업 명 + 강의실 정보까지 포함되어 있다.

학년 정보는 학생 명, 학년 정보가 포함되어 있다고 가정한다.

위와 같은 구조에서,

우리는 수업 정보가 학생 테이블 안에 같이 포함되어 있는 구조로 잘못된 설계를 진행했다.

이 상황에서 새로운 수업이 생긴다면 어떻게 될까?

우리는 해당 수업을 데이터베이스에 추가하고 싶지만, 아직 새로 생긴 수업이라 해당 수업을 듣는 학생이 없을 경우 수업 정보를 학생 테이블에 저장할 수 없을 것이다.

만약 억지로 수업 정보를 추가하기 위해 학생 정보를 비워둔 채 수업 정보만 추가하게 된다면,
학생 테이블 내에 학생 없는 학생 정보가 생겨버리는 불상사가 발생한다.

이는 학생 정보를 저장하려고 생성한 학생 테이블 내의 일관성을 깨트리는 일이 된다.

또, 수업의 강의실 정보가 변경된다면?

우리는 해당 강의실 정보를 가지고 있는 모든 학생 테이블의 정보를 일괄적으로 전부 수정해야 한다.

이를 진행하다 혹여 특정 데이터에 수정 누락이 발생할 경우 똑같이 데이터에 대한 일관성이 박살나게 된다.

이를 방지하기 위해,

위의 갱신 이상을 해결한 방법과 동일하게 학생 테이블과 수업 테이블을 서로 분리하여 정규화를 진행한다면,
수업 테이블과 학생 테이블 모두 일관성을 보장한 채 서로 영향을 주지 않고 데이터를 삽입, 수정할 수 있다.


삭제 이상 이란,

삽입 이상과 마찬가지로 데이터 삭제를 진행하는 도중에 발생하는 이상 현상을 말한다.

마찬가지로 이 이상 현상도 학생 테이블을 이용해 예시를 들어보도록 하겠다.

삭제 이상은 어떻게 보면 삽입 이상과 유사한 점이 많아 이해하기가 좀 더 수월할 수도 있다.

학생 테이블에는 삽입 이상 때와 동일하게 학생 명, 학년, 수업 명, 강의실 정보가 저장되어 있다.

이와 같은 상황에서,

만약 수업이 어떤 사정으로 인해 폐강 하게 된다면 어떻게 될까?

우리는 폐강하는 수업의 정보를 삭제해야 하지만, 이 때 해당 수업을 듣고 있는 학생들의 정보도 같이 삭제되어 버리기 때문에, 삭제를 진행할 수 없다.

물론, 이러한 구조에서는 학생 정보가 수업을 듣고 있는 개수마다 중복되어 저장되기 때문에 하나쯤 삭제된다고 해도 문제가 없을 수도 있지만 어떤 학생이 한 가지의 수업만 듣고 있었다거나,
본인이 듣고 있던 수업이 운 없이 모두 폐강되어 버리는 상황이 오면, 우리는 그 학생의 정보를 같이 삭제해버리고 말 것이다.

우리는 이러한 상황을 방지하기 위해 정규화를 진행해야 하는 것이다.


이제 정규화를 진행해야먄 하는 배경도 배워봤으니,

다음 시간에는 본격적으로 정규화에 대해 알아보도록 하자.

0개의 댓글