Q. 정규화란?

go easy on NG·2023년 8월 9일
0

Q&A

목록 보기
18/18

다음은 정규화에대한 설명을 위해 정리해두었던 내용이다

개념

정규화는 데이터베이스 설계에서 중복을 최소화하고 데이터 일관성을 유지하기 위한 과정입니다.
이 과정은, 데이터를 여러 개의 테이블로 분해하고, 각 테이블이 중복 없이 한 가지 주제에 대해서만 정보를 저장하도록 합니다. 즉 정규화란 크고, 제대로 조직되지 않은 테이블과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것입니다.

목적

정규화의 목적은 다음과 같습니다.
1. 중복을 최소화하여 데이터 일관성을 유지합니다.
2. 데이터 저장 공간을 절약합니다.
3. 데이터를 빠르게 검색할 수 있도록 *인덱싱을 효과적으로 사용할 수 있게 합니다.
여기서 인덱싱이란 데이터베이스에서 데이터를 검색할 때, 빠르게 검색하기 위해 데이터를 정렬하여 저장하는 기술입니다.
따라서 정규화된 데이터베이스에서 인덱스는 특정 속성이나, 속성 조합에 대한 검색을 빠르게 수행할 수 있도록 지원합니다.
4. 데이터의 수정, 삽입, 삭제 작업을 쉽고 빠르게 수행할 수 있게 합니다.

정규화 이상

정규화 과정에서 데이터베이스 설계 상의 문제가 발생하는경우를 정규화 이상이라고 합니다.
정규화 적용시 테이블이 제대로 분해되지 않거나 분해가 지나치게 되어 중복 데이터가 발생하는 등의 문제가 발생할 경우들입니다.
정규화 이상에는 삽입 이상, 삭제 이상, 갱신 이상이 있으며 하나씩 예를 들어 자세히 설명드리겠습니다.

정규화 삽입 이상

정규화 삽입 이상은 데이터를 삽입할 때 불필요한 데이터도 함께 삽입되어 데이터베이스의 일관성이 깨지는 문제입니다.
이는 테이블이 분해되어 데이터가 여러 개의 테이블에 중복 저장되는 경우 발생할 수 있습니다.
예를 들어, 이 테이블에는 회원의 이름, 번호, 등급과 신청여부가 함께 저장되어 있습니다.
이때, 새로운 회원이 등록될 경우, 해당 회원이 신청여부와 등급이 없더라도 함께 삽입되어야 합니다.
이는 데이터의 중복을 유발하며, 불필요한 데이터를 삽입하며 데이터 일관성과 무결성을 해치는 문제가 발생할 수 있습니다.
이를 해결하기 위해서는 테이블을 제대로 분해해야 합니다.
예를 들어, 회원과 등급, 신청여부를 각각의 테이블로 분리하고, 두 테이블 간의 관계를 설정하면, 새로운 회원이 등록될 때 회원이름만 삽입하면 됩니다.

정규화 삭제 이상

정규화 삭제 이상은 테이블에서 일부 데이터를 삭제할 때, 그와 연관된 다른 데이터도 함께 삭제되는 문제입니다.
예를 들어, 이 테이블에서는 학생 정보와 함께 각각의 학생들이 수강한 강의 정보가 저장되어 있습니다.
이때, 강의 정보가 삭제되면 해당 강의를 학과 정보도 함께 삭제되는 문제가 발생할 수 있습니다.
이러한 삭제 이상을 해결하기 위해서는 테이블 간의 관계를 적절하게 설정해야 합니다.
예를 들어, 강의 정보와 학생 정보를 각각의 테이블로 분리하고, 외래키를 사용하여 두 테이블 간의 관계를 설정합니다.
이렇게 함으로써, 강의 정보를 삭제해도 학생의 학과 정보가 함께 삭제되지 않습니다.
따라서, 데이터베이스 설계 시 삭제 이상을 최소화하도록 테이블 간의 관계를 적절하게 설정해야 합니다.

정규화 갱신 이상

정규화 갱신 이상은 테이블에서 일부 데이터를 수정할 때, 일부 데이터만 수정되어 데이터의 일관성이 깨지는 문제입니다.
갱신 이상은 테이블이 제대로 분해되지 않아서 발생할 수 있습니다.
예를 들어, 이름, 번호, 등급, 신청여부에 대한 정보를 담고있는 테이블이 있습니다.
회원의 번호만 변경을 해주려고합니다.
하지만 회원의 번호 변경시 일부 튜플에서만의 번호만 변경되어 회원 이름을 가진, 또는 같은 등급을 가진 튜플이 여러개인 중복이 발생합니다.
이러한 갱신 이상을 해결하기 위해서는 테이블을 적절하게 분해하여 각각의 테이블에서 중복 데이터가 발생하지 않도록 해야 합니다.
전과 같이 각각 테이블을 따로하여 각 테이블 간의 관계를 설정하면 데이터 일관성과 무결성이 유지됩니다.
따라서, 데이터베이스 설계 시 갱신 이상을 최소화하도록 테이블 간의 관계를 적절하게 설정하고, 중복 데이터를 최소화하여 데이터 일관성과 무결성을 유지해야 합니다.

정규화 과정

정규화는 일반적으로 제 1정규화, 제 2정규화, 제 3정규화 등 여러 단계로 나누어 수행됩니다. 이외 bcnf, 4정규화인 다치종속제거와 5정규화인 조인 종속제거가 있지만 가장 많이 사용하는 3정규화까지만 자세히 설명드리겠습니다.

제1 정규화

제1 정규화는 데이터베이스 설계에서 가장 기본적인 정규화 단계입니다.
제1 정규화는 모든 도메인이 원자적인 값을 갖도록 테이블을 구성하는 것을 말합니다.
원자적인 값이란, 해당 도메인이 더 이상 분해될 수 없는 값의 단위를 의미합니다.
예를 들어, 학생 테이블에서 '학생 이름'이라는 속성이 있다면, 제 1정규화를 이용해 이 속성을 여러 개의 원자적인 속성으로 분리해야 합니다.
예를 들어, '이름', '성', '중간이름' 등으로 분리할 수 있습니다.
이를 통해 중복된 데이터와 데이터 일관성 문제를 해결할 수 있습니다.

제2 정규화

제2 정규화는 제1 정규화를 만족하면서 부분 함수 종속을 제거하여 테이블을 구성하는 것을 말합니다.
부분 함수 종속이란, 테이블의 기본 키가 아닌 속성이 기본 키의 일부에만 종속되는 것을 의미합니다.
예를 들어, 테이블에서 '이름', '번호', '등급', '신청여부' 속성들이 있고, '이름'과 '번호'가 결합되어 기본키를 구성한다고 가정해봅시다.
이 경우 '등급'과 '신청여부' 속성은 '이름'과 '번호' 속성에 부분적으로 종속되어 있습니다.
제2 정규화를 수행하기 위해서는 '등급'과 '신청여부' 속성을 기본키에 종속되는 별도의 테이블로 분리해야 합니다.
이를 위해서는 '이름'과 '번호' 속성을 포함하고, '등급'과 '신청여부' 속성을 포함하는 새로운 테이블을 만들어야 합니다.
이렇게 하면 각 테이블은 기본키에 의해 식별되는 속성들만을 포함하게 되므로, 부분적 종속 관계를 제거할 수 있습니다.

제3 정규화

제3 정규화(Third Normal Form, 3NF)는 제2 정규화를 만족하면서 이행적 함수 종속을 제거하여 테이블을 구성하는 것을 말합니다.
이행적 함수 종속이란, A → B, B → C와 같은 종속 관계가 존재하는 경우, A → C와 같은 함수 종속 관계가 발생하는 것을 의미합니다.
예를 들어, 주문 정보 테이블에서 고객의 이름으로부터 고객의 전화번호를 알 수 있고, 전화번호로부터 주소를 알 수 있다면, 이는 이행적 함수 종속입니다.
제3 정규화는 이와 같은 이행적 함수 종속을 제거하여 테이블을 분리합니다.
이를 위해, 종속 관계가 있는 속성들을 각각의 테이블로 분리하고, 외래 키를 사용하여 연결합니다.
이렇게 함으로써, 테이블 간의 중복 데이터와 데이터 무결성 문제를 최소화할 수 있습니다.
제3 정규화를 적용하면 테이블은 더 작아지지만, 데이터 일관성과 무결성을 유지할 수 있습니다.

장점

정규화의 주요 장점은 다음과 같습니다.
1. 데이터 중복을 최소화하여 데이터 일관성과 무결성을 유지할 수 있습니다.
2. 데이터 저장 공간을 절약할 수 있습니다.
3. 데이터 검색과 조인 등의 작업을 빠르고 쉽게 수행할 수 있습니다.
4. 데이터 수정, 삽입, 삭제 작업을 쉽고 빠르게 수행할 수 있습니다.
5. 데이터베이스의 설계와 유지보수가 용이합니다.
6. 데이터를 여러 개의 테이블로 분리하므로, 더 많은 데이터를 처리할 수 있습니다.
7. 데이터의 일관성을 유지하므로, 애플리케이션 개발 및 유지보수가 용이합니다.

단점

정규화의 주요 단점은 다음과 같습니다.
1. 불필요한 조인이 발생할 수 있습니다.
2. 데이터베이스의 복잡도가 증가할 수 있습니다.
3. 데이터의 일부가 수정되는 경우, 여러 개의 테이블을 수정해야 할 수 있습니다.
4. 대규모 데이터베이스에서는 성능 저하가 발생할 수 있습니다.
5. 데이터베이스의 설계가 복잡해지면서, 개발 비용과 시간이 증가할 수 있습니다.

정규화는 데이터의 일관성과 무결성을 유지하고, 데이터베이스의 검색 성능을 향상시키는 등의 장점이 있지만, 테이블 간에 조인이 발생하게 되면 데이터베이스의 성능이 저하될 수 있습니다.
또한, 데이터베이스의 설계가 복잡해지면서 데이터베이스의 유지보수 비용이 증가할 수 있습니다. 이러한 단점을 고려하여, 정규화를 적용할 때에는 상황에 따라 적절한 정규화 수준을 선택하고, 성능 문제가 발생할 경우 인덱싱 등의 기술을 활용하여 대응할 필요가 있습니다.

profile
🐥개발자

0개의 댓글