제1정규형 (1NF): 데이터를 나누자!
조건
- 모든 데이터는 하나의 값만 가져야 해요. (원자값, Atomic Value)
- 각 칸(셀)에 값이 하나만 들어가야 해요.
예시
학생 이름 | 과목 | 선생님 |
---|---|---|
철수 | 수학, 영어 | 김선생님 |
영희 | 과학 | 이선생님 |
문제:
- “철수”가 듣는 과목이 하나의 칸에 여러 개(수학, 영어)가 들어가 있어요.
1NF로 변환:
학생 이름 | 과목 | 선생님 |
---|---|---|
철수 | 수학 | 김선생님 |
철수 | 영어 | 김선생님 |
영희 | 과학 | 이선생님 |
제2정규형 (2NF): 부분 중복 없애자!
조건
- 1NF를 만족해야 해요.
- 기본 키(Primary Key)의 일부만으로 다른 값을 결정할 수 있으면 안 돼요. (부분 함수 종속성 제거)
예시
학생 이름 | 과목 | 선생님 |
---|---|---|
철수 | 수학 | 김선생님 |
철수 | 영어 | 김선생님 |
영희 | 과학 | 이선생님 |
문제:
- “선생님”은 “과목”만 보면 결정할 수 있어요. 즉, “학생 이름”은 필요 없어요.
2NF로 변환: *직접 해보세요
- 학생과 과목: 학생 이름 과목 철수 수학 철수 영어 영희 과학
- 과목과 선생님: 과목 선생님 수학 김선생님 영어 김선생님 과학 이선생님
제3정규형 (3NF): 간접 연결 없애자!
조건
- 2NF를 만족해야 해요.
- 한 속성이 다른 속성을 거쳐서 결정되지 않도록 해야 해요. (이행 함수 종속성 제거)
예시
학생 이름 | 과목 | 학교 |
---|---|---|
철수 | 수학 | 서울중학교 |
철수 | 영어 | 서울중학교 |
영희 | 과학 | 대전중학교 |
문제:
- “학교”는 “학생 이름”으로 바로 결정돼요. “과목”이 필요 없어요.
3NF로 변환: *직접 해보세요
- 학생과 학교: 학생 이름 학교 철수 서울중학교 영희 대전중학교
- 학생과 과목: 학생 이름 과목 철수 수학 철수 영어 영희 과학
제4정규형 (4NF): 독립적인 정보는 따로 저장하자!
조건
- 3NF를 만족해야 해요.
- 하나의 속성이 다른 속성과 독립적으로 관련이 있다면, 이를 따로 분리해야 해요. (다중치 종속성 제거)
예시
학생 이름 | 동아리 | 악기 |
---|---|---|
철수 | 음악부 | 피아노 |
철수 | 음악부 | 바이올린 |
철수 | 체육부 | 피아노 |
철수 | 체육부 | 바이올린 |
문제:
- “동아리”와 “악기”는 서로 상관이 없어요. “학생 이름”과 독립적으로 연결돼요.
4NF로 변환: *직접 해보세요
- 학생과 동아리: 학생 이름 동아리 철수 음악부 철수 체육부
- 학생과 악기: 학생 이름 악기 철수 피아노 철수 바이올린
정리
정규형 | 문제 해결 | 쉽게 말하면 |
---|---|---|
1NF | 데이터를 하나의 값으로 나눔 | 중복된 셀 없게 깔끔히 나누기 |
2NF | 기본 키의 일부로 다른 값을 결정하지 않음 | 부분 중복 없애기 |
3NF | 간접 연결을 없앰 | 불필요한 경로 없애기 |
4NF | 독립적인 정보는 따로 저장 | 서로 독립적인 데이터 분리하기 |
결국 하나의 테이블에 이상한 정보를 모두 한꺼번에 넣으면 안되고, 잘 나누어야 한다는 이야기입니다~
1NF로 변환:
학생 이름 | 과목 | 선생님 |
---|---|---|
철수 | 수학 | 김선생님 |
철수 | 영어 | 김선생님 |
영희 | 과학 | 이선생님 |
2NF로 변환:
학생과 과목
학생 이름 | 과목 |
---|---|
철수 | 수학 |
철수 | 영어 |
영희 | 과학 |
과목과 선생님:
과목 | 선생님 |
---|---|
수학 | 김선생님 |
영어 | 김선생님 |
과학 | 이선생님 |
3NF로 변환:
학생과 학교:
학생 이름 | 학교 |
---|---|
철수 | 서울중학교 |
영희 | 대전중학교 |
학생과 과목:
학생 이름 | 과목 |
---|---|
철수 | 수학 |
철수 | 영어 |
영희 | 과학 |
4NF로 변환:
학생과 동아리:
학생 이름 | 동아리 |
---|---|
철수 | 음악부 |
철수 | 체육부 |
학생과 악기:
학생 이름 | 악기 |
---|---|
철수 | 피아노 |
철수 | 바이올린 |
모두 잘 푸셨으면, 정확히 이해하셨어요! 🎉 제2정규형부터는 테이블을 더 나누어서 데이터 중복을 줄이고, 데이터를 효율적으로 관리할 수 있도록 설계하는 것이 핵심이에요. 간단히 요약하자면:
1. 제1정규형 (1NF): 원자값으로 나누기
- 데이터를 한 셀에 하나씩 저장하게 만드는 단계예요.
- 이 과정은 테이블을 나누는 게 아니라, 셀 속의 데이터를 잘게 쪼개는 작업이에요.
2. 제2정규형 (2NF): 부분 종속성을 제거하기 위해 테이블 분리
- 1NF를 만족한 상태에서, 기본 키의 **일부만으로 결정되는 데이터(부분 종속)**를 따로 떼어내요.
- 예를 들어, “과목”이 “학생 이름”과 독립적으로 반복되는 경우, “과목”을 따로 테이블로 만들어야 해요.
3. 제3정규형 (3NF): 간접 종속성을 제거하기 위해 테이블 분리
- 2NF를 만족한 상태에서, 어떤 속성이 다른 속성을 거쳐 결정되는 경우(이행 종속성)를 분리해요.
- 예를 들어, “학생 이름”이 “학교”를 결정하고, “학교”가 “주소”를 결정한다면, “주소”를 따로 저장해요.
4. 제4정규형 (4NF): 독립적인 정보를 분리하기 위해 테이블 분리
- 3NF를 만족한 상태에서, 서로 독립적인 속성 집합이 한 테이블에 들어가 있으면, 이를 각각 분리해요.
- 예를 들어, “동아리”와 “악기”가 서로 독립적이라면, “동아리 정보”와 “악기 정보”를 따로 저장해요.
정규화를 통해 얻는 장점
- 중복 제거: 데이터를 나누어 저장함으로써 불필요한 반복을 줄여요.
- 무결성 보장: 데이터를 일관성 있게 유지할 수 있어요.
- 업데이트 효율성: 중복된 데이터를 여러 곳에서 수정할 필요가 없어요.
결론
제2정규형부터는 데이터의 중복을 없애고 종속 관계를 정리하기 위해 테이블을 더 나누는 작업이라고 볼 수 있어요. 이렇게 하면 데이터를 깔끔하게 정리하고 관리하기 쉽게 만들 수 있답니다. 😊