디비 설계를 할때, 무결성을 지켜야 함
데이터의 정확성, 일관성, 유효성을 유지하는 성질
개체 무결성 (PK의 성질입니다)
참조 무결성 (FK의 성질입니다)
도메인 무결성 (도메인: 칼럼 값이 가질 수 있는 데이터의 성질)
→ s3_file_name 은 uuid 성질이어야 한다.
null 무결성
key 무결성
고유 무결성
무결성을 지키지 않으면
이상현상
이 발생할 수 있음
삽입 이상
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
물리학과 | 003 |
물리학과를 추가하고자 하는데 물리학과에는 학생이 한명도 없다 → 물리학과 추가 불가능
→ 학번, 학생이름 / 학과 명, 학과 코드 분리 필요
삭제 이상
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
3 | 올리 | 물리학과 | 003 |
올리가 자퇴를 해서 3번 row 를 지워야 한다 → 학과명과 학과 코드까지 한번에 지워지기 때문에 학과명, 학과 코드 정보가 사라진다
→ 학번, 학생이름 / 학과 명, 학과 코드 분리 필요
수정 이상
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
3 | 올리 | 물리학과 | 003 |
4 | 파이 | 물리학과 | 003 |
5 | 랑 | 물리학과 | 003 |
6 | 조 | 물리학과 | 003 |
물리학과의 학과 코드가 004 로 바뀐다면 4개의 행을 수정해야 한다 → 여기서 실수로 3개만 수정한다면 데이터가 상이한 문제가 발생
→ 학번, 학생이름 / 학과 명, 학과 코드 분리 필요
다음과 같은 이상현상을 해결하려면 정규화가 필요하다 (정규화를 해야하는 이유 → 이상현상을 제거 하기 위해)
하나의 값 A에 의해 다른 값 B가 하나의 값으로 결정되는 속성 (A가 B를 결정한다)
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
3 | 올리 | 물리학과 | 003 |
4 | 파이 | 물리학과 | 003 |
5 | 랑 | 물리학과 | 003 |
6 | 조 | 물리학과 | 003 |
학번은 학생이름을 결정한다 학번 → 학생이름 (종속성), 학번
은 종속 결정자
이다
제 1 정규화
수정전
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과, 정치학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
3 | 올리 | 물리학과 | 003 |
수정후
학번 | 학생 이름 | 학과 명 | 학과 코드 |
---|---|---|---|
1 | 에디 | 수학과 | 001 |
2 | 제이크 | 경영학과 | 002 |
3 | 올리 | 물리학과 | 003 |
1 | 에디 | 정치학과 | 004 |
제 2 정규화
수정전
학번 | 학과 명 | 학과 코드 | 점수 |
---|---|---|---|
1 | 수학과 | 001 | 100 |
2 | 경영학과 | 002 | 90 |
3 | 물리학과 | 003 | 80 |
수정후
학번 | 학과 코드 | 점수 |
---|---|---|
1 | 001 | 100 |
2 | 002 | 90 |
3 | 003 | 80 |
학과 코드 | 학과 명 |
---|---|
001 | 수학과 |
002 | 경영학과 |
003 | 물리학과 |
제 3 정규화
수정전
학번 | 학생 이름 | 전화번호 |
---|---|---|
1 | 에디 | 01055558888 |
2 | 제이크 | 01044447777 |
학번을 알면 학생이름을 알 수 있고, 학생이름을 알면 전화번호를 알 수 있다.
학번을 알면 전화번호를 알 수 있게 됨
수정후
학번 | 학생 이름 |
---|---|
1 | 에디 |
2 | 제이크 |
학생 이름 | 전화번호 |
---|---|
에디 | 01055558888 |
제이크 | 01044447777 |
BCNF 정규화
수정전
payment_id | rfq_id | project_name |
---|---|---|
1 | 4 | test-1 |
2 | 4 | test-1 |
3 | 6 | test-3 |
PK는 payment_id 이다
rfq_id 는 payment_id 에 의해 결정 되지만, project_name 은 rfq_id 에 의해 결정된다.
rfq_id 는 후보키가 아니기 때문에 만족하지 않는다.
수정후
payment_id | rfq_id |
---|---|
1 | 4 |
2 | 4 |
3 | 6 |
rfq_id | project_name |
---|---|
4 | test-1 |
6 | test-3 |