🤔정규화(Normalization) 란?

Normalization : "중복을 제거하며, 일관성을 개선하는 Process"

< 정규화 하는 이유 >

⒧.데이터의 수정(삽입, 삭제, 갱신) 이상현상을 제거하기 위해

⑵.데이터 중복을 최소화 하기 위함

🌳정규화의 단계 

 

< 제1정규형 (1NF) >

모든 행이 같은 수의 열을 가져야 하고, 각 열의 값이 더 이상 분할할 수 없는 원자적 값이어야 한다. 예를 들어, 학생이 수강하는 과목을 하나의 열로 표현한다고 한다면.

이 열에 'Math, Science'와 같이 여러 과목을 쉼표로 구분하여 넣는다면, 이는 1NF를 위반하는 것이다. 왜냐하면 '수학, 과학'은 더 이상 분할할 수 있는 값이기 때문이다. 1NF를 만족시키려면, 각 과목을 별도의 행으로 분리해야 한다.

CREATE TABLE Students (
StudentID INT,
NAME VARCHAR(100),
Subjects VARCHAR(100)
);

Insert INTO Students VALUES (1, 'Jone Doe', 'Math, Science');
Insert INTO Students VALUES (2, 'Jane Doe', 'Math, English');

위의 Students Table은 1NF를 위반하는 Table이다.  Subjects에 'Math, English'  이렇게 여러 과목을 Insert하여 원자성을 위반 하기 때문이다.

 

1NF를 위반하고 있는 Student Table을 만족하는 코드는 아래와 같다.  

CREATE TABLE Students (
 StudentID INT,
 Name VARCHAR(100)
 );
 
 CREATE TABLE StudentSubjects (
 StudentID INT,
 Subject VARCHAR(100)
 );
 
 INSERT INTO Students VALUES (1, 'John Doe');
 INSERT INTO StudentSubjects VALUES (1, 'Math');
 INSERT INTO StudentSubjects VALUES (1, 'Science');
 
 INSERT INTO Students VALUES (2, 'Jane Doe');
 INSERT INTO StudentSubjects VALUES (2, 'Math');
 INSERT INTO StudentSubjects VALUES (2, 'English');

이 경우, 'Students' Table은 학생 정보만을, 'StudentSubjects'테이블은 학생이 수강하는 과목 정보를 각각 저장하고 있다.이는 각 컬럼의 값이 원자적이라는 1NF의 원칙을 만족하는 것이다.

 

이를 테이블로 표현하면 다음과 같다.

< Students Table >

StudentID Name
1 John Doe
2 Jane Doe

 < StudentSubjects Table >

StudentID Subject
1 Math
1 Science
2 Math
2 English

< 제2정규형 (2NF) >

2NF는 1NF를 만족하는 테이블에 대해 추가적인 규칙을 제공한다. 2NF를 만족하려면, 테이블의 모든 기본 키가 아닌 열이 기본 키에 완전히 종속되어야 한다. 이는 "부분적 종속성"이 없어야 한다는 것을 의미한다.

부분적 종속성이란, 복합 키(두 개 이상의 열로 구성된 키)의 일부에만 종속되는 열이 존재하는 상황을 말한다.

예를 들어, 학생이 수강하는 과목에 대한 정보를 기록하는 테이블이 있다고 가정해 보자. 이 테이블의 기본 키는 '학번'과 '과목명'으로 구성되어 있다. 이때 '교수명'이라는 열이 '과목명'에만 종속되어 있다면, 이는 2NF를 위반하는 것이다. 왜냐하면 '교수명'은 기본 키의 일부인 '과목명'에만 종속되기 때문이다. 이 경우, 과목에 대한 정보가 여러 곳에 중복되어 저장될 수 있다.

CREATE TABLE StudentCourses (
StudentID INT,
CourseName VARCHAR(100),
ProfessorName VARCHAR(100)
);

INSERT INTO StudentCourses VALUES (1, 'Math', 'Professor A');
INSERT INTO StudentCourses VALUES (1, 'Science', 'Professor B');
INSERT INTO StudentCourses VALUES (2, 'Math', 'Professor A');

위의 코드에서 'ProfessorName'열은 'CourseName'에만 종속되어 있다. 이는 2NF를 위반하는 것이다.

 

2NF를 만족하는 코드는 아래와 같다.

CREATE TABLE Students (
    StudentID INT,
    Name VARCHAR(100)
);

CREATE TABLE Courses (
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100)
);

INSERT INTO Students VALUES (1, 'John Doe');
INSERT INTO Courses VALUES ('Math', 'Professor A');
INSERT INTO Courses VALUES ('Science', 'Professor B');
INSERT INTO StudentCourses VALUES (1, 'Math');
INSERT INTO StudentCourses VALUES (1, 'Science');
INSERT INTO StudentCourses VALUES (2, 'Math');

위의 코드에서 'Students' 테이블은 학생 정보만을, 'Courses' 테이블은 강좌와 강좌를 담당하는 교수의 정보를, 'StudentCourses' 테이블은 학생이 수강하는 강좌의 정보를 각각 저장하고 있다. 이는 각 열이 기본 키에 완전히 종속되어 있으므로 2NF를 만족한다.

 

 

이를 테이블로 표현하면 다음과 같다. 

      < Students Table >

StudentID Name
1 John Doe

                                                                         < Courses Table >

CourseName ProfessorName
Math Professor A
Science Professor B

< StudentCourses Table >

StudentID CourseName
1 Math
1 Science
2 Math

 


< 제3정규형 (3NF) >

3NF는 Table이 2NF를 만족하면서 추가로 '이행적 종속성'이 없어야 함을 요구한다. 이행적 종속성이란, A가 B에 종속되고 B가 C에 종속될 때, A가 C에 간접적으로 종속되는 관계를 말한다. 3NF는 이러한 이행적 종속성을 허용하지 않는다.

예를 들어, 학번(StudentID), 과목명(CourseName), 교수명(ProfessorName)이라는 열이 있는 테이블에서 '과목명'이 '교수명'에 종속되고, '학번'이 '과목명'에 종속되는 경우, '학번'은 '교수명'에 이행적 종속성을 가진다고 할 수 있다. 이는 3NF를 위반하는 것이다. 이행적 종속성을 제거하려면, '교수명'을 별도의 테이블로 분리하고, 이 테이블의 기본 키를 '과목명'으로 설정해야 한다.

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

INSERT INTO StudentCourses VALUES (1, 'Math', 'Professor A');
INSERT INTO StudentCourses VALUES (1, 'Science', 'Professor B');
INSERT INTO StudentCourses VALUES (2, 'Math', 'Professor A');

 

위의 코드는 3NF를 위반하는 코드 예시이다.  위의 코드에서 'ProfessorName' 열은 'CourseName'에 종속되어 있으며, 'StudentID' 열은 'CourseName'에 종속되어 있다. 따라서 'StudentID'는 'ProfessorName'에 이행적 종속성을 가지며, 이는 3NF를 위반하는 것이다.

 

3NF를 만족하는 코드는 아래와 같다.

CREATE TABLE Students (
    StudentID INT,
    Name VARCHAR(100)
);

CREATE TABLE Courses (
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100)
);

INSERT INTO Students VALUES (1, 'John Doe');
INSERT INTO Courses VALUES ('Math', 'Professor A');
INSERT INTO Courses VALUES ('Science', 'Professor B');
INSERT INTO StudentCourses VALUES (1, 'Math');
INSERT INTO StudentCourses VALUES (1, 'Science');
INSERT INTO StudentCourses VALUES (2, 'Math');

위의 코드에서 'Students' 테이블은 학생 정보만을, 'Courses' 테이블은 강좌와 강좌를 담당하는 교수의 정보를, 'StudentCourses' 테이블은 학생이 수강하는 강좌의 정보를 각각 저장하고 있다. 이는 각 열이 기본 키에 완전히 종속되어 있으며 이행적 종속성이 없음을 의미하므로, 3NF를 만족한다. 이와 같이 3NF를 만족하는 설계는 데이터의 중복을 최소화하고 무결성을 보장한다.

 

이를 테이블로 표현하면 다음과 같다. 

< Students Table >

StudentID Name
1 John Doe

< Courses Table >

CourseName ProfessorName
Math Professor A
Science Professor B

< StudentCourses Table > 

StudentID CourseName
1 Math
1 Science
2 Math

 


Reference : 
정규화(Normalization) 쉽게 이해하기 - 아무튼 워라밸 (hleecaster.com)

DBMS의 정규화: 1NF, 2NF, 3NF 및 BCNF [예] (hackr.io)

 

Normalization in DBMS: 1NF, 2NF, 3NF, and BCNF [Examples]

Normalization in DBMS helps reduce redundant info and removes anomalies in database systems. Read about the various forms of normalization here.

hackr.io

 

정규화(Normalization) 쉽게 이해하기 - 아무튼 워라밸

데이터 정규화는 머신러닝에서 꼭 알아야 하는 개념이다. 매우 훌륭한 데이터를 가지고도 정규화를 놓치면 특정 feature가 다른 feature들을 완전히 지배할 수 있기 때문이다. 최소 최대 정규화, Z-

hleecaster.com

 

 

 

 

'SQL 이론' 카테고리의 다른 글

뷰(View)  (0) 2023.06.05
SQL Joins  (0) 2023.05.17
DBMS의 동시성 제어  (0) 2023.05.16
DataBase Key  (0) 2023.05.16
DBMS(Database Management System)  (0) 2023.05.16

+ Recent posts