DB 정규화의 필요성
- 정규화(Normalization)란 중복된 데이터 방지, 부모와 자식 데이터 간의 논리적 관계 유지, 에러 감소 및 재개발 비용 감소 등을 위해 존재한다.
- 어려운 말로는, 테이블 간 중복된 데이터를 줄이며 데이터 무결성을 개선하기 위해 정규화 단계에 따라 관계형 데이터 베이스를 구조화 하는 과정이다.
- 데이터 무결성이란 데이터의 정확성, 일관성, 유효성이 유지되는 것을 뜻한다.
- 데이터의 정확성: 데이터의 중복이나 누락이 없는 상태.
- 데이터의 일관성: 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태.
- 따라서 이를 해결하기 위해 정규화 라는 과정을 거치며 이는 단계별로 존재한다.
- 단계는 여러가지가 있으며 특정 단계는 그 이전 단계의 조건을 모두 만족시켜야 한다.
- 보통 3NF나 그 다음단계까지 적용한다고 들었으며, 너무 많은 정규화 작업은 JOIN으로 인해 성능저하를 야기할 수 있다함.
DB의 잘못된 설계의 문제점
- 잘못 설계된 데이터 베이스는 여러가지 문제점을 가지고 있으며 이는 아래와 같다.
- 데이터의 중복 발생
- 이상현상 발생
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER | D_NAME | D_MANAGER |
---|
- 위와 같이 사원정보와 부서에 관한 정보를 가지고 있는 테이블
EMP_DEPT
가 있다.
- 우리는 이 테이블에서 SSN(주민등록번호)가 기본키라는 것을 알 수 있고, 또한 아래와 같은 관계를 확인할 수 있다.
SSN
-> E_NAME
, B_DATE
, ADDRESS
, D_NUMBER
를 결정한다.
주민등록번호
만 있으면 이름
, 생일
, 주소
, 부서번호
확인 가능.
D_NUMBER
-> D_NAME
, D_MANAGER
를 결정한다.
- 하나의 테이블에 두개의 주제가 포함되어있는 상황.
삽입이상
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER | D_NAME | D_MANAGER |
---|
- 위 상황에서 새로운 부서만을 넣고싶을때, 사원의 정보가 없다면 삽입할 수가 없다.
- 이런 상황을 삽입이상이라고 부른다.
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER |
---|
- 하지만 이처럼 테이블을 분리해 관리한다면,
SSN
가 없어도새로운 부서만 추가할 수 있다.
삭제이상
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER | D_NAME | D_MANAGER |
---|
Person1 | 123-123-1234 | | | 001 | Department1 | Manger_name |
- 위와 같은 상황이 있다고 할 때, 마지막 사원인 Person1이라는 사람이 나가버리면 해당 부서도 사라져 버리는 상황이 발생한다.
- 이런 상황을 삭제이상이라고 부른다.
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER |
---|
Person1 | 123-123-1234 | | | 001 |
D_NUMBER | D_NAME | D_MANAGER |
---|
001 | Department1 | Manger_name |
- 이처럼 테이블을 분리한다면 마지막 사원이 사라져도 부서에 관한 정보는 그대로 유지할 수 있다.
갱신이상
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER | D_NAME | D_MANAGER |
---|
Person1 | 123-123-1234 | | | 001 | Department1 | Manger_name |
Person2 | 223-123-1234 | | | 001 | Department1 | Manger_name |
... | ... | ... | ... | 001 | Department1 | Manger_name |
Person99 | 423-123-1234 | | | 001 | Department1 | Manger_name |
Person100 | 523-123-1234 | | | 001 | Department1 | Manger_name |
- 위와 같은 상황이 있다고 할 때, 부서 이름을
Department1
에서 Dev
팀으로 바꾸려면 전부 바꿔야 하는 상황이 일어난다.
- 이는 인원이 많을수록 비효율 적이며 이러한 상황을 갱신이상 이라고 한다.
- 테이블을 아래와 같이 분리한다면 효율적으로 관리할 수 있다.
E_NAME | SSN | B_DATE | ADDRESS | D_NUMBER |
---|
Person1 | 123-123-1234 | | | 001 |
Person2 | 223-123-1234 | | | 001 |
... | ... | ... | ... | 001 |
Person99 | 423-123-1234 | | | 001 |
Person100 | 523-123-1234 | | | 001 |
D_NUMBER | D_NAME | D_MANAGER |
---|
001 | Dev | Manger_name |
- 위와같이 테이블을 나눈다면 아래 테이블에서
D_NAME
컬럼 값 하나만 변경해 줄 수 있다.
- 지금까지 데이터베이스 정규화의 필요성에 대해 알아봤으며, 여기를 클릭하면 정규화의 과정에 대해 알 수 있다.