RDBMS의 정규화에 대한 이해
RDBMS의 정규화에 대한 이해

RDBMS의 정규화에 대한 이해

Tags
Node.js
Database
Published
January 18, 2024
Author
gozneokhan
 

정규화(Normalization)란?

정규화는 데이터베이스 설계 과정에서 중복을 최소화하고 데이터의 무결성을 유지하기 위한 프로세스입니다. 중복된 데이터를 최소화함으로써 데이터베이스의 일관성과 효율성을 높일 수 있습니다.
특히 관계형 데이터베이스에서 사용되며, 관계형 데이터베이스를 구성하는 테이블들 간의 관계를 명확히 하고 불필요한 중복을 제거함으로써 데이터의 일관성과 효율성을 높이는 것을 목적으로 합니다.

정규화를 사용해서 얻는 이점

먼저, 데이터 일관성을 보장할 수 있습니다.
이는 중복된 데이터를 최소화함으로써 달성됩니다. 데이터베이스에 저장된 정보가 일관되게 유지되어야 하는데, 중복된 데이터가 존재하면 일관성을 유지하기 어려워집니다.
두 번째로, 데이터 무결성을 확보할 수 있습니다.
정규화는 데이터베이스의 무결성을 지키기 위한 규칙을 따르며, 특히 데이터의 삽입, 갱신, 삭제와 같은 연산이 발생할 때 무결성을 유지합니다.
정규화는 또한 쿼리 성능을 향상 시킬 수 있습니다
. 테이블 간의 관계가 명확하게 정의되고 중복이 최소화되면 쿼리 작성이 간편해지고 빠르게 실행될 수 있습니다.
또한, 저장 공간을 최적화 할 수 있습니다.
중복된 데이터를 최소화하면 저장 공간을 효율적으로 사용할 수 있으며, 특히 대량의 데이터가 있는 경우에는 중복을 제거함으로써 저장 공간을 절약할 수 있습니다.
정규화를 수행하지 않고 중복된 데이터를 허용하면 이상 현상이 발생할 수 있습니다. 삽입 이상, 갱신 이상, 삭제 이상과 같은 이상 현상은 데이터베이스의 일관성을 위반하고 데이터의 무결성을 손상 시킬 수 있습니다. 따라서 정규화는 데이터베이스의 품질을 향상 시키기 위한 중요한 단계입니다.

이상 현상(Anomaly)이란?

이상 현상(Anomaly)은 데이터베이스의 정규화가 부적절하게 이루어진 경우, 특히 중복된 데이터가 포함된 테이블에서 데이터 조작 작업을 수행할 때 발생하는 문제를 의미합니다. 이러한 문제들은 데이터베이스의 일관성과 무결성을 해칠 수 있습니다.

학생과 강좌 정보를 담은 비정규화된 테이블 예시

아래 예시에서는 학생과 강좌 정보를 담은 테이블을 비정규화된 상태로 가정합니다.
학생_ID
학생_이름
강좌_ID
강좌_이름
수강_학기
1
학생A
101
수학
1
2
학생B
102
영어
2
3
학생C
101
수학
1
 
  1. 삽입 이상 (Insertion Anomaly)
새로운 데이터를 삽입할 때, 원하지 않는 결과가 발생하는 현상입니다. 새로운 학생을 추가하려면 해당 강좌의 정보도 함께 입력해야 합니다. 새로운 학생이 수강하지 않은 강좌에 대한 정보까지 필수로 입력해야 하는 불필요한 요구가 있습니다.
  1. 갱신 이상 (Update Anomaly)
특정 데이터를 업데이트할 때, 일부만 업데이트되어 데이터의 불일치가 발생하는 현상입니다. 강좌 "수학"의 이름이 "수리"로 변경되면 동일한 강좌를 수강한 모든 학생의 정보를 일일이 수정해야 합니다.
  1. 삭제 이상 (Deletion Anomaly)
특정 데이터를 삭제할 때, 의도치 않게 필요한 데이터까지 함께 삭제되는 현상입니다. 학생A가 수강한 "수학" 강좌를 삭제하면, 해당 강좌의 정보와 연결된 모든 학생의 정보도 함께 삭제되어 버립니다.
이러한 이상 현상은 정규화를 통해 해결할 수 있습니다. 정규화된 테이블 구조에서는 각각의 테이블이 하나의 주제에 집중하도록 분리되므로 이러한 이상 현상이 발생하지 않습니다.

학생과 강좌 정보를 담은 정규화된 테이블 예시

  1. 학생 테이블(Students)
학생_ID
학생_이름
1
학생A
2
학생B
3
학생C
  1. 강좌 테이블(Courses)
강좌_ID
강좌_이름
101
수학
102
영어
  1. 수강 테이블 (Enrollments)
학생_ID
강좌_ID
수강_학기
2
101
1
2
102
2
3
101
1
각 테이블은 특정 주제에 집중하며, 삽입, 갱신, 삭제 연산이 발생해도 다른 테이블에는 영향을 미치지 않습니다. 또한 복 데이터를 최소화하며 일관성을 유지하고, 효율적인 데이터 관리가 가능합니다.
 

단계별 정규화

notion image
 

제 1정규화 (1NF)

각 행의 속성 값이 원자 값으로 구성되어야 합니다. 예를 들어, 다음과 같은 테이블이 있습니다.
학생번호
과목
1
수학, 영어
2
과학
이는 여러 과목이 하나의 컬럼에 나열되어 있으므로 1NF를 만족하지 않습니다. 1NF를 적용하면 다음과 같이 분리됩니다.
학생번호
과목
1
수학
1
영어
2
과학
 

제 2정규화 (2NF)

모든 컬럼이 완전 함수 종속을 만족해야 합니다. 즉, 기본키의 일부에만 종속되는 부분 함수 종속이 없어야 합니다.
학생번호
과목
교수
1
수학
교수A
1
영어
교수B
2
과학
교수A
여기서는 (학생번호, 과목)이 기본키이고, 모든 컬럼이 기본키에 전체적으로 종속되므로 2NF를 만족합니다.

제 3정규화 (3NF)

이행 함수 종속을 제거합니다. 즉, 기본키를 제외한 속성들 간에 이행 종속이 없어야 합니다.
학생번호
교수
1
교수A
1
교수B
2
교수A
이 경우, (학생번호, 교수)가 기본키이고, 교수가 학생번호에 종속되어 있으므로 3NF를 만족합니다.

제 4정규화 (4NF)

다치 종속을 제거합니다. 다치 종속은 하나의 릴레이션에서 한 컬럼이 여러 개의 독립적인 다른 컬럼에 종속되는 경우입니다.
ID
등급
할인율
1
A
0.1
1
B
0.2
2
A
0.15
이 경우, (ID, 등급)이 기본키이며, 등급에 따라 할인율이 다르게 종속되어 있습니다. 이를 4NF로 만들려면 다음과 같이 분리됩니다.
ID
등급
1
A
1
B
2
A
등급
할인율
A
0.1
B
0.2

제 5정규화 (5NF)

마지막 단계에서는 조인 종속을 제거합니다. 조인 종속은 릴레이션을 분해하고 다시 조인하였을 때 원래의 데이터가 손실 없이 복구 되어야 합니다.
Person
Mobile
Food_Likes
A
010-1111
Pizza
B
010-2222
Pasta
(Person, Mobile)이 기본키이고, Mobile에 따라 Food_Likes가 결정되어 있습니다. 하지만, Person과 Mobile 간에는 직접적인 종속성이 없습니다. 5NF를 만족시키려면 다음과 같이 분리됩니다.
Person
Mobile
A
010-1111
B
010-2222
Mobile
Food_Likes
010-1111
Pizza
010-2222
Pasta
이렇게 각 단계에서는 특정 종속성을 만족시키기 위해 테이블을 분해하고 재구성하는 작업이 이루어집니다.

정규화의 단점

데이터베이스 정규화는 중복을 최소화하고 유지 보수를 향상 시킬 수 있는 좋은 아이디어지만, 실제로 사용할 때에는 몇 가지 고려해야 할 점이 있습니다.
먼저, 대용량의 데이터베이스에서는 여러 테이블을 조인해야 하는 경우가 많아져서 조회 성능이 떨어질 수 있습니다. 그렇게 되면 쿼리 작성이 더 복잡해지고 유지 보수가 어려워집니다. 또한, 데이터를 업데이트하거나 추가하는 작업도 좀 더 까다로워집니다.
더 나아가서, 데이터 일관성을 유지하려면 정해진 규칙을 엄격히 따라야 하고, 이를 지키지 않으면 데이터의 무결성에 문제가 생깁니다. 특히 중첩된 구조에서는 여러 테이블을 동시에 업데이트해야 하는 경우가 생기기도 합니다.
조인 비용 또한 고려해야 하는데, 대규모 데이터베이스에서는 많은 수의 조인이 필요할 수 있고, 특히 넓은 테이블의 경우 조인 비용이 높아질 수 있습니다.
마지막으로, 어떤 정규화 수준을 선택할지는 항상 디자이너의 판단에 달려있습니다. 과도한 정규화는 성능 문제를 야기할 수 있고, 반대로 과소 정규화는 데이터 무결성에 영향을 미칠 수 있어서 항상 적절한 균형을 찾아야 하는 어려운 문제입니다.

데이터 조회 성능을 향상 시키기 위한 방법 반정규화(De-normalization)

반정규화(De-normalization)는 데이터베이스 설계에서 성능 향상과 쿼리 작성 편의성을 고려하여 정규화된 데이터베이스를 의도적으로 중복된 데이터를 포함하도록 변경하는 전략입니다.
주로 읽기 중심 작업에 적합하며, 중복된 데이터를 활용하여 조회 성능을 향상 시키고 쿼리 작성을 단순화합니다. 그러나 중복된 데이터 관리와 데이터 무결성에 대한 주의가 필요하며, 주로 OLAP 시스템이나 데이터 웨어하우스에서 활용됩니다.
notion image

글을 마치며

데이터베이스 정규화와 반정규화를 공부하면서, 처음에는 이런 세세한 부분이 왜 중요한지 의문이 들었습니다. 그러나 공부를 통해 데이터베이스 설계의 중요성과 역할을 깊게 이해하게 되었습니다.
정규화는 데이터의 일관성과 무결성을 보장하기 위한 필수적인 과정으로, 중복된 데이터를 최소화하고 데이터베이스를 체계적으로 관리하는 데 도움이 됩니다. 처음에는 '조인이 많아지면 성능에 문제가 생기고, 왜 중복을 피해야 하는 거지?'라는 생각이 들었지만, 정규화의 단점과 한계를 이해하고 나니 성능 최적화의 필요성과 반정규화의 중요성을 깨달았습니다.
대규모 데이터베이스에서는 쿼리 성능이 핵심이 되는 경우가 많고, 이에 따라 데이터의 중복을 허용하여 조회 성능을 개선하는 것이 중요하다는 것을 이해했습니다. 어느 시점에서는 데이터베이스 설계가 성능과의 미묘한 균형을 유지해야 하는 작업이라는 것이 느껴졌습니다.
반정규화는 주로 읽기 중심 작업에 적용되며, 중복된 데이터를 활용하여 쿼리 작성을 단순화시키고 조회 성능을 향상시킬 수 있습니다. 그러나 이 과정에서 중복된 데이터를 관리하는 부담과 데이터 무결성에 대한 책임을 갖게 되었습니다. 이런 측면에서 개발자로서의 책임과 역량이 더 높아져야 할 것 같다는 생각이 들었습니다.
마지막으로, 데이터베이스 설계는 프로젝트의 특성과 목표를 고려하여 조절되어야 한다는 것을 몸소 깨달았습니다. 어떤 경우에는 정규화를 강화하여 데이터 일관성을 확보하고, 어떤 경우에는 반정규화를 통해 성능을 향상시키는 것이 중요하다는 사실을 이해하게 되었습니다.

Reference