본문 바로가기

[Database] 1정규형 & 2정규형

@xuv22025. 7. 24. 22:44

오늘은 1정규형 , 2정규형에 대해 알아 보자.


1정규형

1정규형의 개념은 다음과 같다.

어떤 릴레이션 R 에 속한 모든 속성의 도메인이 원자값만을 갖는다면 1 정규형에 속한다.

즉, 쉽게 생각하면 1속성 = 1데이터를 준수 해야한다. 더 쉽게 생각하면 한칸에 하나의 데이터만 들어가면 1정규형을 만족한다고 한다.

 

만약 다음과 같은 테이블에 데이터가 있다고 하자. 해당 데이터에서 아리는 두가지의 Role 을 가지고 있다.

1정규형은 한칸에 하나의 데이터만 있어야 하기 때문에, 다음과 같이 SQL을 통해 1정규화를 진행할 수 있다.

UPDATE LOL_CHAMPIONS_SAMPLE SET `ROLE` = 'Mage' WHERE name = 'Ahri';
INSERT INTO LOL_CHAMPIONS_SAMPLE VALUES ('Ahri', 'Assassin', 'Ionia', 'Female', '2011-12-14', 'Construct', 196, 'Scythe', 'Freljord', 'A', 2011, 4);

Row 순서 바꾸는 법은 몰라서 보기 좋게 Order By로 정렬 했다

 

이렇게 한칸에 하나의 데이터만 들어 있는 테이블을 1 정규형 테이블이라고 한다.


2정규형

먼저, PK 설정을 위해 ID 컬럼을 하나 만들고 보기 편하게 제일 앞으로 보내자.

ALTER TABLE LOL_CHAMPIONS_SAMPLE ADD COLUMN id int AUTO_INCREMENT PRIMARY KEY;
ALTER TABLE LOL_CHAMPIONS_SAMPLE MODIFY COLUMN id int FIRST;

추가적으로 Release_year 컬럼은 Release_date 컬럼이 있으니 빼도 될 듯?

ALTER TABLE LOL_CHAMPIONS_SAMPLE DROP COLUMN RELEASE_YEAR;

 

2정규형의 정의는 다음과 같다.

어떤 릴레이션 R이 1정규형을 만족하고, 기본키에 속하지 않는 모든 속성이 기본키에 완전 함수 종속이면 2정규형에 속한다.

이때 

쉽게 얘기 하면 기본키를 기준으로, 현재 테이블에서 관계 없는 데이터는 다른 테이블로 빼면 된다. + 기본키가 두개 이상의 컬럼으로 묶여 있을 때, 두개의 기본키에서 하나의 기본키 컬럼에만 종속되어 있는 컬럼을 제거하면 된다(Partial Dependency 제거).

실습을 위해 챔피언 도메인을 기준으로 정규화를 진행해보자.

이렇게 테이블을 분리하고 각 테이블의 아이디로만 작성하여 테이블을 분리하면 될 것 같다.


2정규형 정확하게 표현

위 예시는 사실 좀 난잡해서, 정확히 다시 정리하겠다.

2정규형을 만족하는 테이블은 부분함수 종속성을 제거한 테이블이라고 한다.

 

예를 들어 (회원번호, 프로그램)을 PK로 가지는 이런 테이블이 있다고 생각하자.

수강 등록 현황 테이블 이기 때문에 회원 번호 단독이나 프로그램 단독으로는 PK가 될 수 없다. 즉 이렇게 두 컬럼 이상을 묶어 PK를 만들었을 때 이를 composite primary key 라고 한다.

이때, 이 두 컬럼으로 이루어진 PK에서 하나의 컬럼에만 종속되어 있는 컬럼이 존재할 때, 이는 partial dependency (부분함수종속) 가 있다고 표현한다.

위 테이블을 보면 가격 컬럼은 회원 번호는 프로그램 컬럼에만 종속될 뿐, 회원 번호 컬럼에는 종속되지 않기 때문에 partial dependency가 존재한다고 할 수 있다.

그래서 이 쩌리 컬럼을 다음과 같이 다른 테이블로 빼면 2정규형을 만족하는 테이블이 된다.

프로그램 table

 

최종적으로 정리하면, PK가 두 컬럼 이상으로 이루어져 있을 때, 두 컬럼 중 하나의 컬럼에만 종속되는 컬럼이 있다면 2정규형 위반이라고 하고, 이를 다른 테이블로 빼면 2정규형을 만족하게 된다.

xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차