[SQLD] 정규화(Nomalization) | PART 1

데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장하는 것)을 위해 엔터티를 작은 단위로 분리하는 과정이다. 정규화를 할 경우 데이터 조회 성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다. 하지만 그렇다고 무작정 정규화를 통해 엔터티를 분리해서는 안 된다. 엔터티를 분리하기 위한 조건이 따로 존재한다.
Hi's avatar
Sep 11, 2024
[SQLD] 정규화(Nomalization) | PART 1

💡
데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장하는 것)을 위해 엔터티를 작은 단위로 분리하는 과정이다. 정규화를 할 경우 데이터 조회 성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다.
하지만 그렇다고 무작정 정규화를 통해 엔터티를 분리해서는 안 된다. 엔터티를 분리하기 위한 조건이 따로 존재한다.
 
학생 엔터티 (정규화 전 원본 테이블)
학생 엔터티 (정규화 전 원본 테이블)

✅ 1. 제 1 정규형

💡
모든 속성은 반드시 하나의 값만 가져야 한다.
 
  • 제 1 정규화: 속성값이 하나가 되도록 엔터티를 분리하는 것.
학생 엔터티
학생 엔터티
 
이뿐만 아니라, 유사한 내용의 속성이 여러 개 있더라도 1차 정규화 대상이다.
예를 들면, 특정 학생의 블로그 사이트가 여러 개라면, blog1, blog2, blog3, … 와 같이 속성을 여러 개 지정할 수 있는데, 이를 분리하는 것도 1차 정규화에 해당한다.

✅ 2. 제 2 정규형

💡
엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
주식별자가 단일식별자가 아닌 복합식별자인 경우, 일반속성이 주식별자의 일부에만 종속될 수 있다. 이런 경우 제 2 정규화를 통해 엔터티를 분리해야 한다.
 
  • 제 2 정규화: 일반 속성이 주식별자 모두에 종속되도록 엔터티를 분리하는 것.
 
여기서는 학생이름수강과목이 주식별자(복합)인데, 나이학생이름에만 종속되어 있으므로 아래와 같이 분리해야 한다.
학생 엔터티
학생 엔터티
 
 
수강과목 엔터티
수강과목 엔터티

✅ 3. 제 3 정규형

💡
주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
아래 테이블을 보면, 할인율은 등급에 의해 결정되고 등급은 고객번호에 의해 결정된다. 여기서 주식별자는 고객번호이므로, 할인율은 등급에 의해 결정되면 안 된다.
고객 엔터티
고객 엔터티
따라서, 다음과 같이 엔터티를 분리해야 한다.
 
  • 제 3 정규화: 주식별자가 아닌 모든 속성 간 종속성이 없도록 엔터티를 분리하는 것.
고객 엔터티
고객 엔터티
등급 엔터티
등급 엔터티
이렇게 분리하면 각 고객은 등급이 주어지고, 각 등급마다 할인율이 따로 저장되어 있게 된다.

✅ 4. 주의사항

💡
적절한 정규화는 성능에 유리하지만, 지나친 정규화는 오히려 성능 저하를 야기한다. 너무 과도한 정규화는 데이터 조회 시 테이블 간 조인으로 인해 성능이 악화될 수 있다.
 
 
Share article

soultree