자동차를 만든다고 하면 1차, 2차, 3차 까지 검사를 해야할것이다.
이것을 정규화라고 하는데 정규화로 자동차를 만드는 것이 아니다. 검사만 할뿐
테이블도 마찬가지로 검사를 한다. 주의) 정규화로 테이블을 만들지 말것.
1정규화(1NF)는 데이터의 원자성(Atomicity)을 보장하기 위해 수행된다.
emp_supervisor_id가 2명인 경우가 있다. (한명의 직원의 상사가 1명일 수도있고, 2명일수도 있기 때문에 원
자성을 해친다.) 이때는 테이블을 분리한다.
PrimaryKey가 아닌 특정 열이 부분적인 여러열에 종속되면 안된다.
dept_id가 dept_name, dept_loc를 결정짓는다.
dept_id는 주요키가 아닌데, dept_name, dept_loc를 결정짓기 때문에 부분 종속성이 있는 상황이다.
emp_position_name에 소장이 들어가게 될 때 dept_id가 1이 들어간다고 가정해보자.
dept_id가 1인 부서명은 영업부서이다.
이런 종속성이 존재하면 데이터의 일관성이 무너질 수 있다. 그래서 이행적 종속성을 제거해야한다.
CONSTRAINT chk_emp_position CHECK (
(dept_id = 1 AND emp_position_id IN (1, 2)) OR
(dept_id = 2 AND emp_position_id IN (3, 4))
)
);
테이블 설계시에 정규화를 진행함면서 설계하는 것은 어렵다. 테이블을 세분화하여, 연관관계를 맺는 것이 설계시 편하다. 그리고 설계가 되면, 정규화가 만족하는지 확인하고, 정규화를 만족하지 않으면 수정하면 된다.
그리고 너무 완벽한 정규화가 독이 될 수 있기 때문에, 역정규화도 고려해야 한다. 1NF를 만족하지 않는 테이블도 실무에서는 존재한다.
외우기! 1:n이든 n:n이든
n은 fk의 주인
n은 연관관계의 주인
n은 자식테이블
=> 연주 자식 nf소나타