💙 들어가며
데이터를 설계하면 그것으로 완전한 것일까?
그대로 데이터베이스에 데이터를 차곡차곡 쌓으면 되는 것일까?
논리적 데이터 설계 과정 중에서 정규화를 통해서 우리가 만든 테이블을 더 쪼개야 할지 합해야 할지 판단해보자.
💡 학습내용 정리
#정규화(Normalization)란?
💡 정규화란?
중복을 제거하기 위한 작업이다.
중복이 제거된 파일 형태를 표준으로 보고, 그 표준을 맞추고자 하는 것이 표준화, 즉 정규화이다.
과거에는 데이터에 표준이라는 것이 없었다.
때문에 여러 테이블이 각자 데이터를 복사해서 가져가게 되고 중복이 발생하면서 결함이 생겼다.
이런 참조형태에 대한 중복을 제거하기위해서는 표준 형태에 대한 필요가 생기게 되었고,
그 표준에 맞춰서 중복을 제거하는 것을 정규화라고 한다.
#정규화 단계
그렇다면 정규화를 하는 방법은 어떻게 될까?
1정규화부터 알아볼 것인데, 대개 3정규화까지만 진행해도 결함을 발생을 예방하기에 충분하다고 한다.
💡 정규화 단계에서의 순서
정규화 단계에서 순서는 존재하지 않는다. 단지, 정규화 할 수 있는 방법이 여러가지일 뿐이다.
하지만 일반적으로 1 정규화-2 정규화와 같이 순서대로 정규화를 진행하는 편이다.
#1정규화(1NF)
1정규화부터 알아보자.
💡 (튜플을 기준으로) 하나의 열에는 하나의 값만 올 수 있다.
주문 테이블의 주문 아이템 열이라는 것이 있다면
하나의 주문 번호에 대해서 주문아이템에만 라면, 과자, 소세지.. 처럼 여러 개의 값이 올 수 없다.
1정규화의 가장 핵심적인 원리는 하나의 열에는 동시에 여러개의 값이 들어올 수 없다는 것이다.
즉 한 번 insert될 때 하나의 열에는 하나의 값만 들어가야 한다.
다른 값들은 하나의 값만을 받을 수 있는데 특정 열에서 여러개의 값을 받는 경우,
그 속성들만을 담은 별도의 테이블을 자식 테이블로 만드는데, 이런 과정을 1정규화라고 한다.
#2정규화(2NF)
💡 1NF를 만족하면서 동시에 부분적 함수 종속을 제거한 것이다.
이때 복합키를 PK로 가지고 있으면서 추가 속성이 있는 테이블에 대해서만 고려한다.
복합키만 가지고 있는 경우(추가된 속성이 없는 경우)에 대해서는 고려하지 않는다.
복합키가 결합된 것이 PK로 있고 이 테이블에 복합키를 제외하고 추가 속성이 있을 때,
이 속성이 복합키 중 하나의 키에 대해서만 해당되는 경우 부분적 함수라고 보고 제거한다.
#3정규화(3NF)
💡 2NF를 만족하면서 동시에 이행적 함수 종속을 제거한 것이다.
3정규화 역시 복합키를 가지고 있는 테이블을 대상으로 생각한다.
이때 하나의 속성이 일반 속성을 참조하는 형태를 가질 때 다른 테이블로 나누는 것이다..
이행적 함수란 바로 외래키를 통해 참조하지 못하고, 그 키를 찾기 위해서 다른 속성을 통해야 하는 것을 말한다.
쉽게 생각하면 기본키가 아니라 일반 속성에 종속되어 있는 키가 있을 때 이행적 함수를 가진다고 말한다.
다른 속성을 통해서 외래키를 찾아 참조하게 되는, 건너서 찾아가게 되는 형태이다.
한 테이블 안에서 모든 키는 한 번에 접근이 가능해야 하는데,
얻은 키를 통해 다시 한 번 접근해야 하는 경우가 생길 때 3정규화를 위반했다고 본다.
여기서 이름은 아이디라는 PK를 통해서 한 번에 접근할 수 없다.
형태 아이디라는 일반 속성을 통해서 다시 접근해야 하는 녀석이다.
즉, 이름은 일반 속성에 종속되어 있는 녀석이고 이것이 3정규화를 위반하게 된 것이다.
이럴 때는 참조를 해야 하는 것이니 별도의 테이블을 두어서 관리한다.
💙 마치며
1.
정규화라는 작업이 중복을 제거하는 작업인데,
과유불급이라고..
완벽하게 중복을 없애는 것은 또 바람직하지 않으니
적절하게 잘 사용할 줄 알아야겠다.
'SQL' 카테고리의 다른 글
[뉴렉처 6기] Maven 프로젝트│예외처리(230828) (0) | 2023.08.28 |
---|---|
[뉴렉처 6기] DATABASE│제약조건│도메인│엔티티│관계(230825) (0) | 2023.08.25 |
[뉴렉처 6기] DATABASE│식별키│식별관계/비식별관계(230822) (0) | 2023.08.22 |
[뉴렉처 6기] Oracle SQL│VIEW│DATE DICTIONARY│PL-SQL (0) | 2023.08.21 |
[뉴렉처 6기] DATABASE│데이터베이스 모델링(230821) (0) | 2023.08.21 |