프로젝트에 따라 마감일이 있습니다.
이걸 프로젝트 테이블에 마감일을 기록해야 하는데요.
이렇게 마감일이 중복되면 마감일을 수정할 때 바꿀때도 다같이 바꿔줘야 하는데 이러면 문제가 있는 겁니다.
프로젝트를 참가할 때도 6사원이 1프로젝트 참가할 때 복붙해서 추가하는 경우 2정규화의 위반입니다.
1-1, 1-2, 2-1, 3-2, 4-2, 5-1, 6-1, 6-2로 연결하면 복합키이면서 기본키가 됩니다.
사원-프로젝트-마감일 순으로 관련이 있지 마감일-사원으로 관련이 있진 않습니다.
마감일-프로젝트-사원 순으로 프로젝트 마감일을 챙깁니다.
마감일-사원이라 해서 아무나 사원 잡고 "마감일 맞춰라" 라고 할 수는 없는 경우입니다.
마감일은 복합키 중에 사원 아이디와는 관계가 없기 때문에 마감일은 따로 분리해줘야 합니다.
그래서 마감일을 직접적인 테이블에 올리지 않고 이곳에 마감일을 넣습니다.
테이블을 프로젝트 사원키와 외래키가 많은 곳에 넣는 안되는 이유의 예시가 필요해서 작성했습니다.
2정규화는 복합키가 아니면 쓸일이, 볼일이 별로 없습니다.
3정규화는 3단 논법이라 생각하고 외워야 합니다.
위의 세가지가 충족될 경우 분리해야 합니다.
이름, 역할, 연봉을 기준으로
이름이 그 역할에 맞는지
역할이 그 연봉에 맞는지
a->b b->c 종속 관계가 맞다면
a->c가 성립이 가능합니다.
그리고 아이디의 기본키를 넣어서 직책을 넣습니다.
역할이 이름이 바뀔 수 있기 때문에 아이디까지 넣는 것입니다.
개발팀, 디자인팀 이름이 Dev팀, Design팀으로 바뀔 경우
따로 작성을 할까 싶지만 분리를 굳이 할 필요가 없습니다.
이렇게 구분해도
팀이 1개의 Column밖에 사용하지 않기 때문에 분리하지 않습니다.
역정규화는 제2정규화의 위반이긴 하지만 편리성을 위해 사용합니다.
아래의 사진과 같은 경우 직책 아이디가 역정규화입니다.
프로젝트 아이디와 관련이 깊게 없고 사원 아이디와 관련만 있죠.
개발 편의성이 올라간다는 전제하에 역정규화를 사용합니다.
대신 단점은 직책 아이디가 변경이 되었을 때 직책 이름을 변경해야 합니다.
일단 정규화를 많이 해놓고 정규화를 한 후 개발에 들어가는데
개발에 들어가서 쪼개진 테이블을 하나로 합치는 걸 조인이라 하는데 너무 성능이 느려지면 역정규화를 하게 됩니다.
정답이 없기 때문에 프로젝트에 따라 달라지기도 합니다.
Quiz 1
이름 / 언어 / 전화번호
모빌 / JS / 010-2345-6789
모빌 / TS / 010-2345-6789
모빌 / C++ / 010-2345-6789
정규화 해보세요.