DB 역정규화 - showMeTheMoneyPrac/BE_Repo GitHub Wiki

1️⃣ 프로젝트에서의 정규화된 DB를 다시 역정규화한 이유

역정규화란 정규화를 통해 분리되었던 릴레이션에서 중복을 허용하고 다시 통합하거나 분할하여 구조를 재조정하는 과정이다. 정규화된 릴레이션은 하나의 릴레이션을 분해하기 때문에 원하는 자료가 하나의 릴레이션에 존재하지 않아 조인을 해서 참조해야하는 상황이 잦다.

이는 데이터베이스에 저장된 자료를 검색하는 시간을 증가시키며 성능을 저하시킬 수 있다.

따라서, 데이터베이스의 물리적 설계 과정에서 성능을 향상시키기위해 역정규화를 실행한다.

역정규화의 종류로는 릴레이션 역정규화와 속성 역정규화가 있다.

  • 릴레이션 역정규화
    • 릴레이션의 역정규화에는 릴레이션을 병합하는 방법과 분할하는 방법이 있다.
      • 릴레이션 병합 : 두 릴레이션 간의 잦은 참조로 성능이 저하될 경우 이 문제점을 해결하기 위해 병합한다.
      • 릴레이션 분할 : 릴레이션의 데이터를 검색할때는 목록중의 데이터를 순차적으로 조사하여 원하는 자료를 찾는다.그래서 자주 사용하지 않는 속성이나 튜플이 릴레이션에 있을 경우 검색시 성능을 저하하게 만든다.이 경우에는 자주 사용하는 속성이나 튜플을 분해하여 성능을 향상시킨다.이 분할에는 수직 분할(자주 사용하는 속성과 그렇지 않는 속성을 구분해서 분할)과 수평 분할(자주 사용하는 튜플과 그렇지 않는 튜플을 구분해서 분할)이 있다.
  • 속성 역정규화
    • 릴레이션의 성능을 향상시키기 위해 속성 또는 파생속성을 추가한다.
      • ※파생 속성(Delivered Attribute): 현재 릴레이션에는 없는 속성이지만 작업의 효율을 위해 힌 속성으로부터의 계산이나 가공에 의해 파생되는 속성.

현재 프로젝트에서는 릴레이션 역정규화와 속성 역정규화가 모두 필요한 상황으로 위 작업을 통하여 성능을 향상 시키기 위하여 역정규화를 실행하였다.

인텔리제이 디버그 쿼리 결과

2️⃣  역정규화 활용 부분

  • 릴레이션 역정규화

  • 릴레이션 병합 : 두 릴레이션 간의 잦은 참조로 성능이 저하될 경우 이 문제점을 해결하기 위해 병합한다.

    • 메인 페이지 게시글 목록의 경우, 1:N으로 연결된
  • 속성 역정규화

  • 릴레이션의 성능을 향상시키기 위해 속성 또는 파생속성을 추가한다.

    • ※파생 속성(Delivered Attribute): 현재 릴레이션에는 없는 속성이지만 작업의 효율을 위해 힌 속성으로부터의 계산이나 가공에 의해 파생되는 속성.

3️⃣ 기술에 대한 참고 문헌

정규화 및 역정규화의 기준에 대한 글

[[데이터베이스] 정규화(Normalization)와 역정규화(DeNormalization)](https://junseokdev.tistory.com/m/38)

4️⃣ 기술의 장점

Spring-data-jpa를 활용하여 Entity를 호출하여 For문을 다시 한 번 사용하여 ResponseDto 형태에 맞게 진행하던 로직을 for문을 사용하지 않고 직접적으로 ResponseDto에 알맞은 형태로 반환이 가능하다. → 이에 따라 데이터를 반환하는 속도가 놀라울 정도로 개선되었다.

5️⃣ 기술의 단점

ResponseDto에 해당하는 각 변수의 이름이 Entity의 이름과 동일해야 인식할 수 있으며, 그렇지 않을 경우 alias를 활용하여 각 ResponseDto의 변수명과 일치하게 설정하여야 사용이 가능하다.

6️⃣ 추가적 방안은?

Redis를 활용한 캐싱을 도입하였을 때, 캐싱 오염이 존재하지 않는다면 더욱 효과적인 데이터 반환 속도를 나타낼 수 있을 것이라고 판단된다.