테이블을 만드는것은 알았는데 테이블을 만드는 기준과, 어떠한 데이터들을 모아놓고, 넣어야하는지 궁금할것이라고 생각합니다.
그래서 이번에는 정규화를 배워보려 합니다.
<정규화>
삽입/수정/삭제의 이상현상을 제거하기 위한 작업
이상현상 : 해결할 수 없는 문제
데이터의 중복을 최소화 하는 목적이 있다.
대부분 3차 정규화까지만 진행한다.
※ 정규화를 많이 할 수록 테이블이 많이 쪼개지고 관계가 많이 생기기 때문에 현업에서는 종종 필요한 데이터들을 다시 모으기 위한 작업을 하는데 이를 반정규화라고 부릅니다.
<1NF : 1차 정규화>
하나의 컬럼에 값이 1개씩만 있어야 한다. (데이터의 원자성을 유지해 주어야 한다.)
-> 하나의 컬럼에 값이 2개 이상이면 원하는 데이터를 검색하기 힘들어 집니다.
예를 들어 데이터의 원자성을 지키기 위해, 각 행마다 한 컬럼에 하나의 값을 가져야 합니다.
그렇기 위해 주소라는 컬럼에 "시, 도, 군, 상세주소"를 몽땅 저장하는 것보다는 시, 도, 군, 상세주소를 다 따로 만들어 저장하는 것이 좋습니다.
<2NF : 2차 정규화>
테이블의 모든 컬럼이 서로 관계가 있어야 한다.
위의 그림 중 맨위에 있는 USER테이블에서 상품명은 관련이 없기 때문에 이럴때는 주요 품목 또는 PRODUCT라는 테이블을 추가로 만들어 따로 저장해야 합니다.
<3NF : 3차 정규화>
하나의 컬럼이 다른 컬럼을 결정해서는 안된다.
위의 표를 봤을때 우편번호로 시, 구, 동을 알수 있습니다. 그런데 USER데이터에서 장보고의 우편번호만 바뀐다면 시, 구, 동의 정보와 우편번호가 달라지기 때문에 우편번호(PK)로 관리하는 주소 테이블과, 이름과 우편번호만 가지고 있는 USER테이블로 나누어 정보를 관리하게 해야 합니다.
+) 데이터베이스에서 정규화가 필요한 이유!
데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 인해 공간이 낭비되는데 이런 현상을 이상(Anomaly)라고 합니다. (nomal <-> anomal)
<이상현상의 종류>
- 삽입이상
새 데이터를 삽입하기 위해 불필요한 데이터도 삽입 해야하는 문제
담당 프로젝트가 정해지지 않은 사원이 있다면,
프로젝트 코드에 null을 작성할 수 없으므로 이 사원은 테이블에 추가될 수 없다.
따라서 '미정'이라는 프로젝트 코드를 따로 만들어서 삽입해야 한다.
- 갱신 이상
중복 행 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
한 명의 사원은 반드시 하나의 부서에만 속할 수 있다.
만약 "장보고"이 보안팀으로 부서를 옮길 시 3개 모두 갱신해주지 않는다면 개발팀인지 보안팀인지 알 수 없다.
이러한 현상을 갱신 이상이라고 한다.
- 삭제 이상
행을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제
이순신이 담당한 프로젝트를 박살내서 드랍된다면 이순신 행을 모두 삭제하게 된다.
따라서 프로젝트에서 드랍되면 정보를 모두 드랍하게 된다. 이러한 현상을 삭제 이상이라고 한다. (이순신도 박살)
이러한 이상 현상이 발생하는 이유는 테이블이 정규화가 되어 있지 않기 때문이다.
정규화를 진행하기 위해서는 각 컬럼간의 관련성을 파악해야 하고, 이 관련성을 "함수적 종속성"
(Functional Dependency)이라고 한다.
따라서 하나의 테이블에서는 하나의 함수적 종속성만 존재하도록 정규화를 한다. 하나의 결정자로
나머지 종속자들을 관리해주어야 한다.
<함수>
X -> Y ※ X가 Y에 의존한다.
회원번호는 이름과 급여가 없으면 의미가 없고, 이름은 그냥 사용이 가능하기 때문에
결정자는 종속자들이 없으면 의미가 없어지기 때문에 결정가는 종속자에 의존한다.
X : 결정자 -> X가 Y를 결정
Y : 종속자 -> Y가 X에 종속
'프로그래밍 공부 > DBMS' 카테고리의 다른 글
[lesson] DBMS - 파생 문법 2탄 (SQL 실행순서, SEQUENCE, SUB-QUERY, ROWNUM) (0) | 2021.08.12 |
---|---|
[lesson] DBMS - 파생 문법 1탄 (문자연결, LIKE, DUAL, 집계함수, GROUP BY, ALIAS, ORDER BY) (0) | 2021.08.12 |
[lesson] DBMS - DML (데이터 조작어), TCL (트랜잭션) (0) | 2021.08.12 |
[lesson] DBMS - DDL (데이터 정의어) (0) | 2021.08.11 |
[lesson] DBMS - 개요 (0) | 2021.08.11 |