SQL/정규화

덤프버전 :

분류


프로그래밍 사이트 선정 프로그래밍 언어 순위 목록

⠀[ IEEE Spectrum 2021 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%"
⠀[ Stack Overflow 2022 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%">
⠀[ TIOBE 2023 ]⠀

프로그래밍 언어 목록 · 분류 · 문법


1. 개요
2. 장점
3. 단점
4. 정규화
4.1. 1NF
4.2. 2NF
4.3. 3NF


1. 개요[편집]


SQL의 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위해 사용되며 데이터를 분해하는 과정이다. 주로 관계형 데이터베이스에서만 사용되며 3NF 이상은 하지 않는 편이다.[1]
  • 정규화된 모델은 테이블이 분해된다.[2] 테이블이 분해되면 A 테이블과 B 테이블 간에 조인(JOIN)을 수행하며 하나의 합집합으로 만들 수 있다.
  • 정규화를 하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복 데이터가 제거된다.


2. 장점[편집]


  • 불필요한 데이터를 제거하여 데이터의 중복을 최소화할 수 있기 때문에 저장공간을 효율적으로 이용할 수 있게 된다.
  • 각종 이상 현상(Anomaly)를 방지할 수 있다.
  • 테이블 데이터 집합이 논리적, 직관적으로 구성된다. (자료 구조가 안정적으로 변화한다.)
  • 다양한 관점에서의 쿼리를 지원한다.
  • 데이터 무결성 유지


3. 단점[편집]


  • 릴레이션(관계)의 분해로 릴레이션 간의 참조 연산(JOIN)이 많아져 응답시간이 길어질 수 있다.
  • 상대적으로 타 DBMS로의 구조 이식이 어려워진다.


4. 정규화[편집]


정규화의 과정은 1NF -> 2NF -> 3NF -> BCNF -> 4NF -> 5NF 의 순서를 거친다.

4.1. 1NF[편집]


릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제1정규형에 속한다. (원자성)

수강 Table
수강번호
이름
수강 강의
1001
김나무
물리학
1002
이위키
지리학
1003
박좋아
컴퓨터공학, 화학공학

김나무와 이위키는 물리학과 지리학을 들을 뿐이지만, 박좋아는 복수전공을 통해 컴퓨터공학과 화학공학을 동시에 듣고 있다. 사실 이렇게하여도 SQL DB를 운용하는데 지장은 없지만 윗선에서 '화학공학'을 듣는 친구들을 교수실로 보내게 라고 알람이 내려왔다. 관련 알람을 확인한 SQL 관리자는 쿼리문을 통해 '화학공학'을 듣는 친구들을 찾아야 하는데 문제점이 발생했다.

일반적이라면 단순히

SELECT = * ;
FROM = '수강 Table' ;
WHERE 수강 강의 = '화학공학' ;


으로 찾을 수 있겠지만 1NF가 되어있지 않은 경우

SELECT = * ;
FROM = '수강 Table' ;
WHERE 수강 강의 LIKE '%화학공학%' ;


으로 귀찮게 찾아야 한다는 것이다.(...) 이는 박좋아의 수강 강의의 컬럼이 원자성을 가지지 않기 때문이다. 물론 표에 없는 다른 학생들이 복수전공을 듣고 있다면 관리자는 더욱 머리가 복잡해질 것이다. 하는 수 없이 관리자는 위의 테이블을 1NF 정규화하여 아래와 같은 테이블로 만들었다.

수강 Table
수강번호
이름
수강 강의
1001
김나무
물리학
1002
이위키
지리학
1003
박좋아
컴퓨터공학
1003
박좋아
화학공학

이제 각 ROW마다 컬럼의 값이 1개만 들어있게 됨으로써 원자성이 충족되었다.
1NF는 검색 쿼리의 단순화를 위해서라는 목적도 있지만 실질적으로는 데이터의 중복성을 제거하고 데이터의 일관성과 무결성을 유지하기 위한 목적이 더욱 크다. 중복된 데이터가 존재할 경우 데이터베이스의 크기가 커지고 데이터의 일관성이 깨지는 등의 문제가 발생할 수 있기 때문에, 제1정규형을 수행하여 DB의 효율성을 높이고 데이터의 신뢰성을 확보할 수 있다.



4.2. 2NF[편집]


후보 키 K와 K에 속하지 않는 속성 A가 있을 때 A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 하는 경우 제2정규형에 속한다.
쉬운 이해 : 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제2정규형에 속한다.


수강등록현황 Table
수강번호
이름
수강 강의
강의 지각 벌금
납부여부(회)
1001
김나무
물리학
10,000
2
1002
이위키
지리학
7,500
1
1003
박좋아
컴퓨터공학
5,000
0
1003
박좋아
화학공학
15,000
1
1004
최고다
물리학
10,000
1

나무대학교의 이사장은 강의마다 지각한 사람들의 횟수를 체크하여 벌금을 매기기로 하였다! 학생들은 불만이 컸지만 그런대로 수긍하며 지각벌금을 묵묵히 내고 있었는데 물리학을 강의하는 교수님께서 이제부터 물리학의 지각 벌금은 10,000원이 아닌 15,000원 입니다. 라고 선언하였다. 해당 SQL 데이터를 관리하는 관리자는 이제 2가지 선택을 해야만 한다.

  • 1번 선택지 : 물리학의 '강의 지각 벌금'에 해당하는 컬럼을 일일이 찾아 15,000원으로 고친다. 다만 SQL 관리자가 과거에 본 기억상으로는 나무대학교에서 물리학을 듣는 학생 수가 수천명 이상이었다고 기억한다.
  • 2번 선택지 : 제2정규화를 해서 현재 테이블의 주제와 관련 없는 컬럼을 다른 테이블로 빼낸다.

관리자는 수천명 이상의 데이터를 일일이 15,000원으로 바꿀 자신이 없었기에 2번 선택지를 통해 제2정규화를 진행하여 아래와 같은 테이블을 만들었다.


수강등록현황 Table
수강번호
이름
수강 강의
납부여부(회)
1001
김나무
물리학
2
1002
이위키
지리학
1
1003
박좋아
컴퓨터공학
0
1003
박좋아
화학공학
1
1004
최고다
물리학
1

강의 지각 벌금 Table
강의
강의 지각 벌금
물리학
15,000
지리학
7,500
컴퓨터공학
5,000
화학공학
10,000

이제 각각의 테이블은 제2정규형을 만족하는 테이블이 되었다. SQL 관리자는 귀찮게 물리학의 '강의 지각 벌금'에 해당하는 컬럼을 일일이 찾으면서 고칠 필요가 없는 것이다! 이제 '강의 지각 벌금 Table'에서 물리학에 해당하는 벌금을 15,000원으로 변경하기만 하면 끝이 난다. 제2정규화를 통해 관리가 매우 편해진 것이다. 하지만 다른 문제도 생겼는데 이제는 '수강등록현황 Table'를 보기만해서는 강의 지각 벌금이 얼마인지를 알 수 없게 되어버린 것이다.



4.3. 3NF[편집]


제2정규형에 속하면서 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속[3]이 되지 않으면 제3정규형에 속한다.



파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-03 14:26:55에 나무위키 SQL/정규화 문서에서 가져왔습니다.

[1] 일반적인 경우, 1NF부터 3NF까지의 정규화만으로도 데이터 중복, 무결성 제약 조건 위반 등의 문제를 해결하는 데 충분하다고 여겨지기 때문이다. 하지만 대규모 트랜잭션의 처리 등이 필요해질 경우 BCNF를 넘어 심지어는 5NF까지 진행을 해야할 수도 있다.[2] 즉 아래의 정규화 과정에서 나오겠지만 테이블이 분할되며 복잡한 관계의 테이블이 만들어지게 된다. A는 B를 참조하는 식으로...[3] 여기서 이행적 함수 종속이란 A->B, B->C, A->C가 성립하는 것을 의미한다. 이를 C가 A에 이행적으로 함수 종속 되었다고 한다.