정규화의 개념
정규화는 최소한의 데이터만을 하나의 엔터티에 가지는 방식으로 데이터를 분해하는 과정입니다. 데이터의 일관성, 중복을 줄이고 최대한의 데이터 유연성을 가지는데 초점을 둡니다. 그리고 데이터의 중복을 제거하고 데이터 모델의 독립성을 확보하고 데이터의 이상현상을 줄이기 위한 DB 설계 기법입니다.
정규화는 엔터티를 상세화하는 과정으로 논리 데이터 모델링 수행 시점에서 고려하게 됩니다.
이상현상(Abnormality)
정규화를 하지 않아 발생하는 현상입니다.
- 삽입이상 : 데이터를 삽입하는 과정에서 발생하는 비효율 또는 오류가 발생할 수 있습니다.
- 갱신이상 : 데이터를 수정할 때 중복 데이터로 인해 일관성 문제가 발생할 수 있습니다.
- 삭제이상 : 데이터를 삭제할 때 함께 의도치 않은 데이터가 손실될 수 있는 현상이 발생할 수 있습니다.
정규화의 단계별 정리
정규화는 제1정규화부터 제5정규화까지 있지만, 실질적으로는 제3정규화까지만 수행됩니다.
- 제1정규화(1NF)
- 테이블 내 컬럼의 모든 속성 값이 원자성(한 속성이 하나의 값을 갖는 특성, Atomic)을 갖도록 구성되어야 합니다.
- 제2정규화(2NF)
- 제1정규화를 만족한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해하는 과정입니다.
- 완전 함수 종속 : 기본키를 구성하는 모든 컬럼의 값이 다른 컬럼을 결정짓는 상태입니다.
- PK가 2개 이상일 때 발생하며 PK의 일부와 종속되는 관계가 있다면 분리합니다.
- 제1정규화를 만족한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해하는 과정입니다.
- 제3정규화(3NF)
- 제2정규형을 만족한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리하는 과정입니다.
- 이행적 종속 : A → B, B → C의 관계가 성립할 때, A → C가 성립되는 것을 말합니다.
- A, B와 B, C로 분리하는 것이 제3정규화입니다.
- 제2정규형을 만족한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리하는 과정입니다.
- BCNF(Boyce_Codd Normal Form) 정규화
- 모든 결정자가 후보 키가 되도록 테이블을 세밀하게 분해하는 단계입니다.
- 결정자가 후보키가 아닌 다른 컬럼에 종속되면 안 됩니다.
반정규화(Denormalization)
정규화된 데이터베이스는 이상(Anomaly) 발생이 적지만, 반정규화가 필요한 경우도 있습니다. 반정규화는 데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법입니다. 시스템의 성능 향상, 개발 및 운영의 단순화를 위해 정규화된 데이터 모델을 중복, 통합, 분리하는 데이터 모델링 기법입니다.
- 반정규화 수행 케이스
- 정규화에 충실하여 종속성, 활용성을 향상되지만 수행 속도가 느려지는 경우
- 다량의 범위를 자주 처리해야 하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
반정규화의 필요성
- 성능 개선 : 복잡한 조회 성능을 향상하기 위해 반정규화를 선택합니다.
- 간단한 트랜잭션 처리 : 잦은 조인 연산을 줄여 트랜잭션을 간단하게 합니다.
- 시스템 확장성 : 대용량 데이터의 효율적인 처리를 위해 데이터 구조를 최적화합니다.
관계와 조인
두 엔터티가 관계를 가진다는 의미로, 부모의 식별자는 자식에 상속하고 상속된 속성을 매핑키(조인키)로 활용하는 것을 의미합니다. 먼저 존재해야 하는 테이블이 부모입니다.
- 관계의 분류
- 존재적 관계 : 엔터티 간의 상태를 의미하는 단계롤 A라는 엔터티가 B라는 엔터티의 존재에 영향을 주는 관계 (사원과 부서)
- 행위적 관계 : 엔터티 간의 어떤 행위가 있는 것을 의미합니다. (주문과 고객)
조인
조인이란, 어떤 두 테이블이 위와 같은 관계를 맺게 되면 조인이 필요할 수 있습니다. 정규화로 분리된 두 테이블의 데이터를 동시에 출력하거나 관계가 있는 테이블을 참조하기 위해서는 데이터를 연결해야 하는데 이 과정을 조인이라고 합니다.
계층형 데이터 모델
자기 자신끼리 관계가 발생하여 셀프 조인을 가지는 경우를 계층형 데이터 모델이라고 합니다. 즉, 하나의 엔터티 내의 인스턴스끼리 계층 구조를 가지게 됩니다.
SELECT
E1.NAME AS 사원이름,
E2.NAME AS 매니저이름
FROM
EMP.E1, EMP.E2
WHERE
E1.MGR = E2.EMPNO;
상호 배타적 관계
상호 배타적 관계란, 두 테이블 중 하나만 가능한 관계를 의미합니다. 예를 들면, 주문 엔터티에는 개인 또는 법인 하나만 상속될 수 있는 경우를 말합니다. 즉, 주문이 개인 고객 또는 법인 고객 둘 중 하나의 고객만 관계를 가질 수 있음을 의미합니다.
트랜잭션
트랜잭션이란, 하나의 연속적인 업무 단위로, 하나의 트랜잭션에는 여러 SELECT, INSERT, UPDATE, DELETE 등이 포함될 수 있습니다. 트랜잭션에 의한 관계는 필수적인 관계 형태를 가집니다.
예를 들어, A 고객이 B 고객에게 100만원을 이체하려고 할 때 다음과 같은 과정이 일어납니다.
- A 고객의 잔액이 100만원 이상인지 확인합니다.
- 이상이면 A 고객의 잔액을 -100만원을 UPDATE 합니다.
- B 고객의 잔액에 +100만원을 UPDATE 합니다.
이때 2번과 3번의 과정이 동시에 수행되어야 합니다. 즉, 모두 성공하거나 모두 취소되어야 합니다. 이런 특성을 갖는 연속적인 업무 단위를 트랜잭션이라고 합니다.
주의
각각의 INSERT 문으로 개발되면 안 됩니다. A 고객의 잔액 차감과 B 고객의 잔액 가산이 서로 독립적으로 발생하면 안 됩니다.
부분 COMMIT이 불가능하며, 동시에 COMMIT 되거나 ROLLBACK 처리되어야 합니다.
필수적 / 선택적 관계
- 필수적 관계 : 두 엔터티가 하나의 트랜잭션을 이룰 때 필수적 관계입니다.
- 선택적 관계 : 두 엔터티가 서로 독립적인 수행이 가능할 때 선택적 관계입니다.
- IE 표기법
- 원을 사용하여 필수적 또는 선택적 관계를 구분합니다.
- 필수적 관계는 원을 그리지 않습니다.
- 선택적 관계는 관계선 끝에 원을 그립니다.
- Baker 표기법
- 실선과 점선으로 필수적 또는 선택적 관계를 구분합니다.
- 필수적 관계는 실선으로 선택적 관계는 점선으로 작성합니다.
NULL
NULL이란, DBMS에서 아직 정해지지 않은 값을 의미합니다. 0 또는 ""(빈 문자열)과는 다른 개념입니다. 모델 설계 시 각 컬럼별로 NULL을 허용할 것인지를 결정해야 합니다.
- NULL의 특성
- NULL을 포함한 연산 결과는 항상 NULL입니다. NULL을 사전에 치환(NVL)한 후에 연산할 수 있습니다.
- 집계 함수는 NULL을 제외한 연산 결과를 리턴합니다. COUNT 시에도 전체 행의 수보다 적은 값이 출력될 수 있습니다.
NULL은 IE 표기법에서는 허용 여부를 알 수 없습니다. Barker 표기법에서는 속성 앞에 동그라미가 있는 경우 NULL 허용을 의미합니다.
Ref.
'🎈 자격증 & 시험 > SQLD' 카테고리의 다른 글
[SQLD] 5장. SQL 관리 구문 (0) | 2024.11.16 |
---|---|
[SQLD] 4장. SQL 활용과 고급 기능 (0) | 2024.11.15 |
[SQLD] 3장. SQL 기본 개념 및 활용 가이드 (1) | 2024.11.12 |
[2024 SQLD] 1장. 데이터 모델링의 이해 (0) | 2024.10.30 |