아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1 | 1 |
xodl | 태이 | 20230201-2 | 1 |
xodl | 태이 | 20230201-3 | 1 |
ekqls | 다빈 | 20230201-4 | 2 |
ekqls | 다빈 | 20230201-5 | 2 |
삽입이상 : 말 그대로 삽입할 때 이상이 발생하는 문제
아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1 | 1 |
xodl | 태이 | 20230201-2 | 1 |
xodl | 태이 | 20230201-3 | 1 |
ekqls | 다빈 | 20230201-4 | 2 |
ekqls | 다빈 | 20230201-5 | 2 |
wjddbs | 정윤 | NULL |
새롭게 가입한 회원의 데이터를 삽입하고자 할 때 불필요한 데이터(구매번호)까지 삽입해야 한다.
갱신이상 : 중복 레코드가 있어서 일부 데이터만 갱신되어 데이터의 값이 서로 불일치하는 문제
아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1 | 2 |
xodl | 태이 | 20230201-2 | 1 |
xodl | 태이 | 20230201-3 | 1 |
ekqls | 다빈 | 20230201-4 | 2 |
ekqls | 다빈 | 20230201-5 | 2 |
태이 라는 회원의 등급이 일부만 2로 변경되고 일부는 1 그대로 남아있는 문제가 발생한다.
삭제이상 : 필요한 데이터까지 같이 삭제되는 문제
아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1 | 1 |
xodl | 태이 | 20230201-2 | 1 |
xodl | 태이 | 20230201-3 | 1 |
ekqls | 다빈 | 20230201-4 | 2 |
ekqls | 다빈 | 20230201-5 | 2 |
wjddbs | 정윤 | 20230202-1 | 0 |
정윤 이라는 회원이 구매를 취소하여 해당 데이터를 삭제하려고 할때, 회원 정보까지 모두 삭제되는 문제가 발생한다.
아이디 → 이름, 등급
으로 표현이 가능하다. 이 테이블에서는 아이디가 회원을 구분하는 기본키가 되기 때문에 더욱 그러하지만, 굳이 기본키나 후보키가 아니라도 결정자의 역할을 할 수 있다.아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1, |
아이디 | 이름 | 구매번호 | 등급 |
---|---|---|---|
xodl | 태이 | 20230201-1 | 1 |
xodl | 태이 | 20230201-2 | 1 |
xodl | 태이 | 20230201-3 | 1 |
아이디 | 이름 | 이벤트 번호 | 당첨 여부 | 등급 |
---|---|---|---|---|
xodl | 태이 | 20230201-1 | Y | 1 |
xodl | 태이 | 20230201-2 | N | 1 |
xodl | 태이 | 20230201-3 | Y | 1 |
ekqls | 다빈 | 20230201-4 | N | 2 |
ekqls | 다빈 | 20230201-5 | Y | 2 |
wjddbs | 정윤 | 20230202-1 | N | 0 |
아이디 | 이벤트 번호 | 당첨 여부 |
---|---|---|
xodl | 20230201-1 | Y |
xodl | 20230201-2 | N |
xodl | 20230201-3 | Y |
ekqls | 20230201-4 | N |
ekqls | 20230201-5 | Y |
wjddbs | 20230202-1 | N |
아이디 | 이름 | 등급 |
---|---|---|
xodl | 태이 | 1 |
xodl | 태이 | 1 |
xodl | 태이 | 1 |
ekqls | 다빈 | 2 |
ekqls | 다빈 | 2 |
wjddbs | 정윤 | 0 |
이
결다조의 이
다.아이디 | 등급 | 할인율 |
---|---|---|
xodl | 1 | 1% |
ekqls | 2 | 2% |
wjddbs | 0 | 0% |
아이디 | 등급 |
---|---|
xodl | 1 |
ekqls | 2 |
wjddbs | 0 |
등급 | 할인율 |
---|---|
1 | 1% |
2 | 2% |
0 | 0% |
결
다조의 결
!한 학생은 하나의 과목에 대해 한 강사의 강의만 수강할 수 있다.
각 강사는 하나의 과목만 가르친다.
한 과목은 여러 강사가 담당할 수 있다.
학번 | 과목 | 강사 |
---|---|---|
1 | 알고리즘 | tom |
1 | 자료구조 | chris |
2 | 알고리즘 | tom |
2 | 운영체제 | anne |
null | 네트워크 | olivia |
이렇게 어떤 강사가 어떤 과목을 가르치는지, 그리고 어떤 학번의 학생이 어떤 과목을 수강하는지에 대한 테이블이 한꺼번에 있으면 어떨까?
아무도 수업을 듣지 않는 네트워크 수업의 학번이 null로 관리된다.
학번, 과목 → 강사를 알아낼 수 있다.
강사 → 과목을 알아낼 수 있다.
이 테이블에서 강사는 후보키가 아니다. 강사 속성 하나 만으로 구별되는 데이터 하나를 찾을 수 없기 때문이다. (학번 1, 2 학생이 둘다 조회된다.)
그러므로 결정자인 강사가 후보키가 아니므로 BCNF 정규형을 만족하지 못한다.
학번 | 강사 |
---|---|
1 | tom |
1 | chris |
2 | tom |
2 | anne |
강사 | 과목 |
---|---|
tom | 알고리즘 |
chris | 자료구조 |
anne | 운영체제 |
olivia | 네트워크 |