목록으로
DB

정규화와 비정규화에 대해서 알아보자

Dev Park
3/28/2023
137 views

서론

데이터 모델링 논리적 데이터 모델링에서 정규화라는 과정을 거친다.
하지만 우리가 실제로 데이터베이스를 사용해보면 정규화라는 과정이 효율이나 성능에 안좋은 영향을 끼치는 경우가 있다.
오늘은 이 비정규화에 대해서 알아보고 어떤 경우에 비정규화를 해야하고 안해야하는지에 대해서도 알아보자.

비정규화

정규화는 데이터의 중복을 줄이고 데이터 무결성을 향상시키는 방식이다.
하지만 정규화가 필요없는 경우에도 정규화를 진행한다면 여러 테이블의 데이터를 받아오거나 결합해야하는 경우에 복잡하고 느린 성능이 발생할 수 있다.

그렇기때문에 쿼리 성능의 향상을 위해 데이터의 중복 감소와 무결성 향상을 포기하는 것이 비정규화이다.
테이블 간의 데이터를 복제하여 조인을 필요없게하거나 미리 계산된 결과를 저장함으로써 복잡한 작업을 줄여 데이터 검색 속도를 늘릴 수 있다.

항상 비정규화 하면 안되는 건가?

데이터베이스를 설계하다보면 이 테이블 저 테이블로 나누어서 설계를 하게된다.
이 과정에서 필자또한 귀찮은데 그냥 한 테이블에 다 합쳐버리면 안되나 하는 생각을 늘 한다.
하지만 정규화 과정이 필요한 이유가 있다.

예를 들어 중복된 데이터가 여러 테이블에 있는 경우 이걸 수정하거나 삭제해야한다고 생각해보자.
그렇다면 중복된 데이터들을 하나하나 찾아서 삭제하고 수정해야한다.
그러다 중간에 실수로 수정되지않거나 삭제되지않은 데이터가 발생한다면 어플리케이션에 문제가 발생할 것이다.
또한 모든 데이터가 한 테이블에 있다면 필요한 데이터뿐만 아니라 필요없는 데이터까지도 모두 불러와야하기때문에 성능적으로 불리한 경우가 생긴다.

그렇기때문에 우리는 상황에 따라 정규화와 비정규화를 옳바르게 사용해야한다.

어떨때 비정규화를 사용해야하고 사용하지 않아야할까?

비정규화를 사용해도 되는 경우는 아래와 같다.

  • 읽기 중심의 어플리케이션

어플리케이션에 데이터가 추가되거나 수정, 삭제의 작업보다 그저 데이터를 읽기만하는 작업이 많다면 비정규화가 유리하다.

  • 복잡한 쿼리문을 사용해야하는 경우

여러 테이블을 항상 조인하고 집계하는 복잡한 쿼리문을 사용하는 경우, 비정규화를 통해 미리 계산한 데이터를 저장해두어서 쿼리 속도를 높이는데 도움이 될 수 있다.

비정규화가 불리한 경우

비정규화가 불리한 경우는 아래와 같다.

  • 쓰기 중심의 어플리케이션

어플리케이션에서 수정, 삭제, 추가와 같은 쓰기 중심의 작업이 많다면 비정규화하는 것이 불리하다.
비정규화된 모든 테이블을 일일이 작업해줘야하기때문에 성능적으로 불이익을 받을 수 있다.

  • 데이터 무결성을 유지해야하는 경우

비정규화는 중복된 데이터를 누락하여 수정하거나 삭제, 추가하지 못한경우 데이터 불일치 및 여러 문제가 발생할 수 있다.
또한 해당 작업에 복잡성을 유발할 수 있으므로 비정규화가 불리하다.

  • 저장소 공간 부족

비정규화는 데이터를 중복하여 저장하기때문에 정규화한 데이터보다 더 많은 저장소 공간을 차지한다.
저장소 공간이 부족할 경우 비정규화를 하지 말아야한다.

마치며

비정규화는 성능과 효율적인 부분을 제외하면 단점이 많다.
데이터를 잘 관리하기 위해서는 정규화 과정이 필수적이지만 일부 비정규화를 통해 성능적인 부분을 챙기는 것도 잊지 말아야 한다.