프로젝트를 진행하면서 최적화를 위한 DB속도 증가에 대해서 여기저기 찾아보았다. 가장 기본적으로 쓰이는 것 indexing이지만 생성 수정 삭제가 자주 일어나는 댓글이나 게시글 테이블에는 부적합하다고 판단해서 어떤게 있을까? 찾아보다가 비정규화를 진행하게 되었다.
보통 관계형데이터 베이스를 구축할 때엔 정규화 작업을 진행한다. 데이터의 무결성을 지키고, 작은 단위로 쪼개서 관계설정을 하면 유지 관리가 편리하고, 데이터의 중복성이 떨어지기 때문에 정확성이 높아진다.
비정규화는 이와 반대되는 개념과 같다. 테이블과 테이블의 관계를 join이 아닌 중복되는 컬럼을 허용함으로써 join에 대한 연산을 줄이고 이로써 DB의 읽기 속도를 늘리는 구축 방법이다.
장점들은 join작업을 줄이는 것으로 파생된다.
빠른 검색 속도: 데이터 중복으로 인해 검색 속도가 빨라질 수 있다. 중복 데이터를 조회하면서 발생하는 join 작업이 줄어들기 때문이다.
적은 리소스 사용: 비정규화는 일반적으로 더 적은 리소스를 사용하며, 처리 시간도 빠르다. 적은 join이 필요하기 때문에 더 적은 CPU 및 메모리 사용된다.
간단한 쿼리: 정규화된 데이터베이스는 여러 개의 테이블로 분할되어 있어, 데이터를 가져오기 위해서는 여러 개의 테이블을 join해야 하는 경우가 많다. 이에 비해, 비정규화된 데이터베이스는 간단한 쿼리로 데이터를 가져올 수 있기 때문에 쿼리 작성 및 실행이 간단해진다.
단점은 주로 중복데이터를 관리하기 때문에 발생한다.
데이터 중복: 데이터 중복은 일관성과 데이터의 정확성을 저하시킬 수 있다. 데이터를 수정해야 하는 경우 중복된 모든 데이터를 수정해야 한다.
데이터 불일치: 중복된 데이터가 다른 값을 가지는 경우 데이터의 불일치가 발생할 수 있다. 이는 데이터의 일관성을 저해시키며, 데이터 무결성에 대한 문제를 초래할 수 있다.
데이터 업데이트의 복잡성: 중복된 데이터가 존재하면, 데이터의 일관성을 유지하기 위해 중복된 데이터를 모두 업데이트해야 하는 경우가 있다. 이는 데이터의 업데이트가 복잡해질 수 있다.
저장 공간의 낭비: 데이터 중복은 저장 공간을 낭비시킬 수 있다. 중복된 데이터를 저장하면 저장 공간을 많이 차지하게 되며, 디스크 I/O 작업 시간도 늘어날 수 있다.
필자는 비정규화를 진행하면서 장점을 살리고 단점을 보안할 수 있는 방법을 생각하게 되었다.
장점은 비정규화를 진행하면 그대로 따라올 것이고, 단점의 원인과 과정에서 보안점을 찾아 생각해 본다면
단점 1번과 3번 항목에 대해서는 수정해야하는 데이터의 경우 발생하는 문제점이다. 그렇다면 수정(update)가 불가능한 데이터라면 문제없지 않을까?
단점 2번 항목에 대해서는 중복된 데이터가 서로 다른 값을 가지게 되는 경우가 발생할 경우이다. 이 또한 중간에 한쪽에 수정으로 인한 발생일 것이며, 그 값이 무결성과 일관성을 해치지 않는다면 수정되지 않는 데이터이며 유니크한 값을 가지면 가능할 것이다.
단점 4번 항목은 데이터 자체의 중복에 의한 공간의 증가이다. 이 부분은 비정규화를 진행하면 중복된 데이터를 가질 수 밖에 없기 때문에 정말 필요하면서 적은 양의 데이터만 비정규화 작업을 진행한다면 데이터 사용 공간의 낭비가 줄어들 것이다.
따라서 나는 게시글과 댓글의 유저 email을 가져오는 부분만 따로 비정규화 작업을 진행하여, join작업을 줄일 수 있었다.
특히나 댓글의 경우 대댓글도 존재함으로 comment에 join으로 user테이블을 가져오고, 거기에 다시 join으로 recomment별칭을 부여한 comment테이블을 가져오며, 한번더 그 recomment의 user email을 가져오기 위해 한번더 join하는 총 3번의 join작업이 이루어지는 항목을 비정규화를 통해서 join작업을 한번으로 줄일 수 있었다.