요즘 내가 제일 관심있어하는 데이터베이스에 대해 공부하는 중이다. 아직 많이 부족하지만 다른건 몰라도 데이터베이스만큼은 꽉잡고가자는 생각. 그 중 오늘 관계형 데이터베이스 특강에서 배운 정규화에 대해 정리해보려한다.
데이터베이스 정규화
데이터베이스 설계에서 데이터를 구조화하여 데이터 중복을 최소화하고 무결성을 유지하기 위한 과정
정규화는 여러 단계로 나뉘며, 각 단계는 더 구조화되고 효율적인 데이터베이스를 만드는데 기여함
1정규화 (1NF) -> 효율적으로 데이터 다루기
1정규화는 데이터베이스 테이블의 각 열이 원자값(더 이상 분해할 수 없는 값)을 갖도록 하는 것을 의미.
즉, 각 열에는 하나의 값만 포함되며, 복수의 값이나 중첩된 구조를 갖지 않음.
- 1정규화의 조건
- 모든 열의 값이 원자적 : 각 열은 더 이상 나눌 수 없는 단일 값을 가져야 함
- 각 행이 고유: 테이블 내의 각 행은 고유해야 하며 중복되지 않아야 함
- 각 열이 동일한 유형의 데이터를 가져야 함: 한 열이 숫자 값을 가진다면 그 열의 모든 값은 숫자여야 함
- 1정규화된 테이블:
학생ID | 학생이름 | 전화번호 |
1 | 홍길동 | 010-1234-5678 |
1 | 홍길동 | 010-8765-4321 |
2 | 김철수 | 010-2345-6789 |
각 열은 원자값을 가지고, 여러 값을 포함하지 않음
2정규화 (2NF) -> 데이터 중복 줄이기
2정규화는 1정규화를 만족하면서, 부분 함수 종속을 제거하는 것. (부분 함수 종속은 기본 키의 일부에만 종속된 속성 의미)
이는 복합 기본 키를 사용할 때 발생함
- 2정규화의 조건
- 1정규화를 만족해야 함 : 테이블이 먼저 1정규화를 만족해야 함
- 모든 비주요 속성이 기본 키 전체에 완전 함수 종속이어야 함. : 비주요 속성(일반 열)이 기본 키의 일부분이 아니라 전체에 종속되어야 함
- 모든 비주요 속성(기본키 구성 컬럼이 아닌 다른 컬럼)이 테이블의 기본 키에 대해 완전 함수적 종속(하나의 컬럼값이다른 컬럼값에 의해 결정되는 관계)이어야 함
- 예시
- 1정규화된 테이블:
학생ID | 과목명 | 교수이름 | 교수사무실 |
1 | 수학 | 김교수 | A101 |
1 | 영어 | 이교수 | B202 |
2 | 수학 | 김교수 | A101 |
위 테이블은 복합 기본 키(학생ID, 과목명)를 가지고 있으며, 교수사무실이 교수이름에 부분 종속됨. 이는 2정규화를 위반
- 2정규화된 테이블:
학생-과목 테이블:
| 학생ID | 과목명 |
|--------|----------|
| 1 | 수학 |
| 1 | 영어 |
| 2 | 수학 |
교수-과목 테이블:
| 과목명 | 교수이름 | 교수사무실 |
|--------|----------|--------------|
| 수학 | 김교수 | A101 |
| 영어 | 이교수 | B202 |
-> 각자 독립적인 테이블을 갖게 됨
-> 모든 비주요 속성이 기본키에 완전 함수적으로 종속
-> 중복이 없기에 변경사항이 있어도 하나만 수정해주면 됨
-> 데이터 무결성 확보와 특정 정보 스캔도 강력
정리
- 1정규화는 테이블의 각 열이 원자값을 가지도록 하여 데이터의 중복을 최소화하고 구조를 단순화하는 단계
- 2정규화는 1정규화를 만족하면서 기본 키의 일부에 종속된 속성을 제거하여, 데이터의 무결성을 유지하는 단계
- 이를 통해 데이터베이스의 구조가 보다 체계적이고 일관성 있게 됨
- 2정규화가 무조건 좋아보일 수 있으나,데이터 정보 조회 빈도가 잦고 무결성 문제를 겪지 않을 자신이 있다면 1정규화가 나은 선택일 수도 있음
-> 역정규화
예전에 스타트업 근무 당시 meta base에서 user의 ID와 product의 ID를 이용해 엮어서 원하는 데이터를 뽑아냈던 기억이 나는 특강이었다. 그동안 내가 이용하던게 2정규화된 테이블이라는 것도 이번에 처음 알았다. 그래도 이용하던게 있어선지 개발 시작하고 한 공부중에 가장 이해가 잘가고 재미 있었다. 앞으로 데이터베이스 공부를 더 열심히 하게 만들 것 같은 특강이었다. 3정규화랑 다른 것들도 더 공부해봐야겠다.
'개발 기초 다지기' 카테고리의 다른 글
내일배움캠프 28일차 : SQL (Structured Query Language) (0) | 2024.05.25 |
---|---|
내일배움캠프 27일차 : bcrypt 암호화 (0) | 2024.05.23 |
내일배움캠프 25일차 : Node.js 활용 CS 개념 (1) | 2024.05.21 |
내일배움캠프 24일차 : 알고리즘 문제 정리(없는 숫자 더하기, 제일 작은 수 제거하기, 가운데 글자 가져오기, 내적, 약수의 개수와 덧셈) (0) | 2024.05.20 |
내일배움캠프 23일차 : VS Code Node.js 프로젝트 초기 세팅 (0) | 2024.05.17 |
댓글