정규화는 데이터베이스 설계에서 데이터의 중복을 최소화하고 데이터 무결성을 보장하기 위해 데이터를 구조화하는 과정이다.
제1 정규화는 모든 속성이 원자값(Atomic Value)을 가져야 한다는 원칙을 따른다.
즉, 각 컬럼에 하나의 값만 존재해야 함
예시:
비정규화된 테이블:
| 주문번호 | 상품 |
|----------|--------------|
| Q001 | P001, P002 |
| Q002 | P003 |
1NF 적용 후:
| 주문번호 | 상품번호 |
|----------|--------------|
| Q001 | P001 |
| Q001 | P002 |
| Q002 | P003 |
제2 정규화는 제1 정규화가 적용된 상태에서 기본 키가 아닌 모든 속성이 기본 키에 대해 완전 함수적 종속을 가져야 한다는 원칙이다.
즉, 부분적 종속을 제거해야한다.
예시:
비정규화된 테이블:
| 주문번호 | 상품번호 | 상품명 |
|----------|----------|---------|
| Q001 | P001 | 상품A |
| Q001 | P002 | 상품B |
| Q002 | P003 | 상품C |
2NF 적용 후:
주문 테이블:
| 주문번호 |
|----------|
| Q001 |
| Q002 |
상품 테이블:
| 상품번호 | 상품명 |
|----------|---------|
| P001 | 상품A |
| P002 | 상품B |
| P003 | 상품C |
주문_상품 테이블:
| 주문번호 | 상품번호 |
|----------|----------|
| Q001 | P001 |
| Q001 | P002 |
| Q002 | P003 |
제3 정규화는 제2 정규화가 적용된 상태에서 기본 키가 아닌 모든 속성이 기본 키에 대해 이행적 종속을 가지지 않도록 한다.
즉, 기본 키가 아닌 칼럼이 다른 기본 키가 아닌 칼럼에 의존하는 경우를 제거해야 한다는 것이다.
예시:
비정규화된 테이블:
| 주문번호 | 상품번호 | 상품명 | 공급업체 |
|----------|----------|--------|---------|
| Q001 | P001 | 상품A | 공급업체X |
| Q002 | P002 | 상품B | 공급업체Y |
3NF 적용 후:
주문 테이블:
| 주문번호 |
|----------|
| Q001 |
| Q002 |
상품 테이블:
| 상품번호 | 상품명 | 공급업체 |
|----------|---------|---------|
| P001 | 상품A | 공급업체X |
| P002 | 상품B | 공급업체Y |
주문_상품 테이블:
| 주문번호 | 상품번호 |
|----------|----------|
| Q001 | P001 |
| Q002 | P002 |
데이터 중복 및 불일치 발생
| 학생ID | 이름 | 과목 | 점수 |
|--------|---------|----------|------|
| 101 | 홍길동 | 수학 | 90 |
| 101 | 홍길동 | 영어 | 85 |
| 102 | 이순신 | 수학 | 95 |
| 101 | 홍길동 | 수학 | 92 | <-- 데이터 중복홍길동의 수학 점수가 두 번 기록되었음.업데이트 이상(Anomalies)
| 직원ID | 이름 | 부서 | 급여 |
|--------|---------|----------|------|
| 201 | 김철수 | 인사부 | 5000 |
| 202 | 박영희 | 인사부 | 5500 |
| 203 | 이민호 | 영업부 | 6000 |저장 공간 낭비
| 고객ID | 이름 | 주소 | 전화번호 |
|--------|---------|------------|--------------|
| 301 | 장보고 | 서울시 강남구 | 010-1234-5678 |
| 302 | 유관순 | 서울시 강남구 | 010-8765-4321 |
| 303 | 안중근 | 서울시 강남구 | 010-5678-1234 |'서울시 강남구' 주소가 반복 저장되어 불필요한 저장 공간을 차지데이터 무결성 보장
정규화를 통해 중복 데이터를 제거하여 데이터의 무결성을 보장
예시: 각 학생의 점수를 별도의 테이블로 분리하여 중복을 방지
학생 테이블:
| 학생ID | 이름 |
|--------|---------|
| 101 | 홍길동 |
| 102 | 이순신 |
성적 테이블:
| 학생ID | 과목 | 점수 |
|--------|--------|------|
| 101 | 수학 | 90 |
| 101 | 영어 | 85 |
| 102 | 수학 | 95 |
효율적인 데이터 관리
정규화를 통해 데이터를 체계적으로 분리하여 관리
예시: 직원과 부서를 분리하여 각 테이블에서 독립적으로 관리
직원 테이블:
| 직원ID | 이름 | 부서ID |
|--------|---------|--------|
| 201 | 김철수 | 1 |
| 202 | 박영희 | 1 |
| 203 | 이민호 | 2 |
부서 테이블:
| 부서ID | 부서명 |
|--------|--------|
| 1 | 인사부 |
| 2 | 영업부 |
데이터 일관성 유지
정규화를 통해 데이터가 일관성 있게 유지
예시: 고객과 주소를 분리하여 주소를 일관성 있게 유지
고객 테이블:
| 고객ID | 이름 | 주소ID |
|--------|---------|--------|
| 301 | 장보고 | 1 |
| 302 | 유관순 | 1 |
| 303 | 안중근 | 1 |
주소 테이블:
| 주소ID | 주소 |
|--------|-------------|
| 1 | 서울시 강남구 |
이렇게 정규화를 통해 데이터의 중복과 불일치를 방지하고, 데이터 삽입, 삭제, 수정 시 발생할 수 있는 문제를 최소화하며, 저장 공간을 효율적으로 사용할 수 있기에 정규화는 매우 중요하다.
NVL 함수는 Oracle 데이터베이스에서 NULL 값을 다른 값으로 대체하는 데 사용됨.
NULL은 데이터베이스에서 값이 없음을 나타내는 특수한 값.
NULL은 "알 수 없음" 또는 "존재하지 않음"을 의미하며, 이를 처리하는 방법이 중요
IS NULL 조건식은 특정 컬럼의 값이 NULL인지 확인할 때 사용
예시:
SELECT * FROM 테이블명 WHERE 컬럼명 IS NULL;
IS NULL 조건식은 비교 연산자(=, <>, > 등)와 함께 사용할 수 없음.
대신 IS NULL 또는 IS NOT NULL을 사용해야 함
예시:
SELECT * FROM 테이블명 WHERE 컬럼명 IS NOT NULL;
집계 함수는 NULL 값을 무시하고 연산을 수행.
그러나 모든 값이 NULL인 경우 결과는 NULL이 됨.
SELECT SUM(컬럼명) FROM 테이블명 WHERE 조건식;
-- 모든 값이 NULL인 경우 결과는 NULL
NVL 함수는 NULL 값을 대체하므로 인덱스를 사용할 때 효율성이 떨어질 수 있다.
엔터티에는 데이터를 유일하게 식별할 수 있는 속성이 반드시 존재해야 하며, 이를 식별자라고 한다.
식별자를 통해 그 엔터티의 본질을 규정하게 되므로 식별자 정의는 매우 중요
예시:
주문상세 엔터티의 식별자를 주문번호 + 상품번호로 정의한다면, 한 주문 내에서 여러 상품 선택은 가능하나 해당 상품은 한번만 선택할 수 있다고 규정하는 것
INSERT INTO 주문상세 (주문번호, 상품번호) VALUES ('Q001', 'P001');
INSERT INTO 주문상세 (주문번호, 상품번호) VALUES ('Q001', 'P001'); -- 불가
트랜젝션은 데이터베이스 관리 시스템(DBMS)에서 하나의 작업 단위로 수행되는 일련의 연산들을 의미한다.
트랜젝션은 반드시 다음 네 가지 특징(ACID)을 가진다.
트랜젝션의 모든 연산은 모두 성공적으로 수행되거나, 전혀 수행되지 않은 것처럼 처리되함.
즉, 트랜젝션 내의 모든 작업이 완벽히 수행되지 않으면 아무런 작업도 수행되지 않은 상태로 복귀해야 해야만 함.
트랜젝션이 완료된 후 데이터베이스는 항상 일관성 있는 상태를 유지해야 함.
일관성 규칙은 데이터베이스의 무결성을 유지하기 위한 제약 조건을 의미
트랜젝션은 서로 독립적으로 수행되어야 하고, 하나의 트랜젝션이 완료되기 전에 다른 트랜젝션이 해당 트랜젝션의 중간 결과를 참조해서는 안 됨.
트랜젝션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 함.
시스템 오류가 발생하더라도 완료된 트랜젝션의 결과는 보존되어야 할 것.
AVG의 경우 SUM / COUNT 와 동일하다.
SELECT AVG(수당) FROM 테이블명;
SELECT SUM(수당) / COUNT(수당) FROM 테이블명;
다만, COUNT(수당)이 0인 경우, 즉 수당 칼럼의 모든 값이 NULL인 경우에는 분모가 0이 되고 SUM(수당)이 NULL을 반환하므로 계산이 불가하며 이 경우 AVG(수당)은 NULL을 반환함.
다만,NULL이 아닌 값을 0으로 나누면 에러가 발생한다.