데이터 모델과 SQL에 대해서 정규화, 반정규화, 트랜잭션 개념에 대해서 이야기해봅시다.
데이터 모델과 SQL 개요
성능 데이터 모델링은 데이터 베이스(DataBase)의 성능을 향상 시키기 위해서 데이터베이스(DB)의 설계 단계부터 성능과 관련된 사항들을 모델링할 때 반영될 수 있도록 하는 것을 의미합니다. 성능 데이터모델링에는 정규화, 반정규화, 테이블 통합, 테이블 분할이 있습니다.
성능 데이터 모델링은 데이터 모델에 맞게 먼저 정규화를 진행합니다. 데이터베이스의 용량과 트랜잭션의 유형들을 파악하여 성능을 낮추는 부분이 없는지를 확인합니다. 용량과 트랜잭션(Transaction)의 유형에 맞게 끔 반정규화를 진행해야 합니다. 성능 향상을 위해서는 이력 테이블에 대한 모델을 조정하거나 식별자인 PK(Primary Key)와 FK(Foreign Key)를 조정하고 수퍼 타입과 서브 타입 조정들을 진행합니다. 그리고 데이터 모델의 성능을 검증합니다.
정규화 정리와 반정규화 정리를 통해 성능 데이터 모델링에 대해서 더 자세히 알아봅시다.
정규화 정리
정규화(Normalization)는 데이터 정합성을 위해서 엔티티(Entity)를 작은 단위로 분리하는 과정을 의미합니다. 여기서 데이터 정합성은 데이터의 정확성과 일관성을 유지하고 보장하는 것을 말합니다. 데이터 정규화는 데이터에 대한 중복성을 없애고 데이터가 관심사별로 처리되도록 엔티티를 나눔으로써 성능을 향상시키는 활동입니다. 엔티티를 작은 단위로 분리하는 것이 중요한 포인트입니다.
정규화를 진행할 때 데이터 조회 성능은 처리 조건에 따라서 좋아지는 경우도 있지만 안 좋아지는 경우도 있습니다. 다만, 데이터 입력, 수정, 삭제에 대한 성능은 일반적으로 높아진다고 볼 수 있습니다. 데이터 조회만 달라질 수 있는 것이므로 데이터 조회의 경우 반 정규화를 진행하는 경우가 있습니다.
엔티티(Entity)는 무작정 분리하는 것은 아닙니다. 정규화(Normalization)를 진행하기 위해서는 일정한 규칙이 있습니다. 일정한 룰이 있으므로 그 룰을 따라야 합니다. 일정한 룰은 제 1정규형, 제2정규형, 제3정규형으로 설명될 수 있습니다.
제1정규형은 모든 속성은 반드시 하나의 값만 가져야 한다는 것입니다. 제1정규형은 유사한 속성이 반복되는 경우에도 1차 정규화 대상이 됩니다. 하나의 속성이 여러 값을 가지고 있는 경우 어플리케이션에서 데이터를 꺼내서 사용할 때 불필요한 분리를 사용해야 하기 때문에 식이 번거로워질 수 있습니다.
제2정규형은 엔티티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 한다는 것입니다. 주식별자가 단일 식별자가 아닌 복합 식별자의 경우 일반 속성이 주식별자의 일부에만 종속될 수 있는데 이런 경우에는 문제가 발생할 수 있습니다. 만약 코드와 코드명이 하나의 엔티티안에 들어가 있을 경우 데이터 이상 현상이 발생할 수 있습니다. 주식별자가 없는 경우에는 입력될 수 없는 현상과 코드명이 바뀔 경우 기존에 적재되어 있는 데이터를 모두 변경해줘야 하는 것입니다.
제3정규형은 주식별자가 아닌 모든 속성 사이에는 서로 종속될 수 없다는 룰입니다.
정규화를 진행할 때 주의 사항은 적절한 정규화를 진행하는 것은 성능 관점에서 유익하지만 너무 지나친 정규화는 오히려 성능 저하를 불러 일으킬 수 있습니다. 왜냐하면 원하는 데이터를 추출하기 위해서는 여러 개의 테이블을 조인(JOIN)해야 하기 때문입니다.
정규화 정리는 매우 중요합니다.
반정규화 정리
반정규화(De-Normalization)은 데이터 조회의 성능을 높이기 위해서 테이블 내 데이터의 중복을 허용하거나 데이터를 그룹핑 하는 과정을 의미합니다.
반 정규화는 정규화의 반대 개념입니다.
반정규화(De-Normalization)의 경우 조회 성능은 향상될 수 있지만 반대로 데이터의 입력, 수정, 삭제에 대한 성능은 낮아질 수 있습니다. 그리고 데이터의 정합성 문제도 발생할 수 있습니다. 반정규화의 경우 정규화를 진행한 다음 거치게 됩니다.
반정규화의 경우도 정규화처럼 일정한 규칙과 룰이 존재합니다. 반정규화는 데이터베이스의 성능을 높이기 위해서 데이터의 중복을 허용하고 테이블 간 조인(JOIN)을 줄이는 방법입니다. 반정규화는 정규화된 데이터 모델을 중복, 통합, 분리하는 데이터 모델링 기법으로 볼 수 있습니다. 반정규화에는 테이블 반정규화, 컬럼 반정규화, 관계 반정규화가 있습니다.
[반정규화 종류]
구분 | 내용 |
1 | 테이블 반정규화 |
2 | 컬럼 반정규화 |
3 | 관계 반정규화(중복 관계 제거) |
테이블 반정규화에는 테이블 병합, 테이블 분할, 테이블 추가가 있습니다.
[테이블 반정규화 구분]
구분 | 내용 |
1 | 테이블 병합 |
2 | 테이블 분할 |
3 | 테이블 추가 |
테이블 병합에는 1:1 관계 테이블 병합, 1:M 관계 테이블 병합, 수퍼 서브 타입 테이블 병합이 있습니다.
테이블 병합은 업무 프로세스에서 조인이 필요한 경우가 많아서 테이블을 통합하는 것이 성능 측면에서 오히려 유리하다고 판단될 경우 고려하는 방법입니다. 1:M 관계 테이블 병합은 어느 한쪽에 해당하는 엔티티의 속성 개수가 많아서 병합했을 때 중복 데이터가 많아지기 때문에 테이블 병합에는 좋지 않습니다.
테이블 분할은 테이블 수직 분할과 테이블 수평 분할이 있습니다. 테이블 수직 분할은 엔티티의 일부 속성을 별도의 엔티티로 분할하는 것입니다. 테이블 수직 분할은 1대 1 관계가 성립합니다. 테이블 수평 분할은 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할하는 것입니다.
테이블 추가의 경우 중복 테이블 추가와 통계 테이블 추가, 이력 테이블 추가, 부분 테이블 추가가 있습니다.
컬럼의 반정규화에는 중복 컬럼 추가, 파생 컬럼 추가, 이력 테이블 컬럼 추가가 있습니다.
관계 반정규화는 업무 프로세스 상에서 조인이 필요한 경우가 많아서 중복 관계를 추가하는 것이 성능 측면에서 좋다고 판단할 때 고려하는 방법입니다.
반정규화 정리는 매우 중요합니다.