2023. 6. 27. 13:04ㆍDB
테이블 설계
- 테이블은 어떤 공통된 속성을 가진 집합이다.
- 테이블 명은 집합 명사나 복수 명사가 되어야한다.
- 테이블은 현실 세계의 개념이나 집합을 나타낸 것이다.
- 공통된 속성들 중 선택되어야 하는 것은 가장 상위의 개념 집합이다.
- 아래의 경우 중 2번째가 더 효율적이다. → 테이블에 접근 VS where 구문 사용
- 회원을 등급(일반,프리미엄)으로 나누는 경우 → 일반 유저 테이블, 프리미엄 유저 테이블
- 회원에 등급 컬럼이 있는 경우
- 아래의 경우 중 2번째가 더 효율적이다. → 테이블에 접근 VS where 구문 사용
- 반드시 기본키를 설정할 것
결론 : 테이블이란 고유한 기본키를 가진 공통점에 의해 정의된 것들의 집합이다!
정규형
정규형은 데이터의 갱신이 발생한 경우에도 부정합이 발생하기 어려운 테이블의 형태이다.
제 1 정규형(1NF)
제 1 정규형의 정의는 ‘테이블 셀에 복합적인 값을 포함하지 않는다’이다.
(기본적으로 관계형 데이터베이스에서는 제 1정규형을 다 만족한다.)
💡 왜 그래야할까??
테이블 셀에 복합적인 값을 가질 수 있게 한다면, 레코드의 단일성을 보장하지 못 한다.
<사원 테이블>
사원ID | 사원 이름 | 사원 나이 | 피부양자 |
1 | 가 | 44 | 김씨 |
2 | 나 | 34 | 박씨 |
3 | 다 | 55 | 조씨,남씨 |
위의 표는 제 1정규형을 만족하지 못 한다.
왜냐하면, 사원 ID 3인 행의 피부양자가 배열로 적혀있기 때문이다.
사원 집합에서 피부양자라는 집합까지 동시에 관리하는 것은 바람직하지 않다.
따라서, 사원이라는 집합과 피부양자라는 집합을 분리해서 관리하도록 하자!
<사원 테이블>
사원ID | 사원 이름 | 사원 나이 |
1 | 가 | 44 |
2 | 나 | 34 |
3 | 다 | 55 |
<피부양자 테이블>
피부양자 ID | 이름 | 나이 | 사원 ID |
1 | 김씨 | 12 | 1 |
2 | 박씨 | 15 | 2 |
3 | 조씨 | 7 | 3 |
4 | 남씨 | 10 | 3 |
여기서 알 수 있는 사실 : 사원과 피부양자가 1:N 관계일때 N에 FK가 있어야 한다는 것!
제 2 정규형(2NF)
제 2 정규형은 제 1정규형을 진행한 테이블에 모든 속성이 기본 키에 완전 함수 종속 되도록 테이블을 분해하는 것입니다.
예를 들어서, 다음과 같이 수강 강좌 테이블이 있다고 하자(제 2정규화 x)
<수강 강좌 테이블>
학생 번호 | 강좌 이름 | 강의실 | 성적 |
501 | DB | 110 | A+ |
401 | DB | 110 | B |
502 | DS | 111 | A |
501 | DS | 111 | C |
503 | OS | 111 | B+ |
이 테이블의 기본키는 {학생 번호, 강좌 이름}으로 복합키이다.
하지만 이 테이블에는 다음과 같은 함수 종속이 존재합니다.
- {학생 번호} → {성적}
- {강좌 이름} → {강의실}
부분 함수 종속 즉, 기본 키를 구성하는 열의 일부에만 함수 종속이 존재하기 때문에 제 2 정규형을 만족하지 못 합니다.
따라서, 제 2 정규형을 만족시키기 위해서는 다음과 같이 분해하여야 합니다.
<수강 강좌 테이블>
학생 번호 | 강좌 이름 | 성적 |
501 | DB | A+ |
401 | DB | B |
502 | DS | A |
501 | DS | C |
503 | OS | B+ |
<강좌 테이블>
강좌 이름 | 강의실 |
DB | 110 |
DS | 111 |
OS | 111 |
- 기존 테이블은 본래 가지고 있던 기본키를 가짐
- 분해된 테이블은 기본키의 일부인 {강좌 이름}을 기본키로한 테이블
TIP : 기본키를 기준으로 생각해라, PK가 복합키가 아니면 제 2 정규형 만족.
💡 분해 안 할 경우 생기는 문제점이 뭘까??
DB 강의실이 변경된 경우 (갱신 이상)
분해되기 전 테이블에서는 갱신을 2번 해줘야함. → 복수의 행을 갱신해줘야 하기 때문에 불편함, 만약 다 갱신을 안 해줬을 경우에 위험함.
분해할 경우 갱신 1번만 해도 됨.
제 3 정규형(3NF)
제 3 정규형은 제 2 정규형을 진행한 테이블에서 이행적 종속을 없애도록 테이블을 분해한 것이다.
💡 이행적 종속이란
테이블의 함수 종속 중 함수 종속이 2단계에 걸쳐서 일어나는 것
{x} → {y} {y} → {z}
이 경우, 이행적 종속이 존재하는 것
<강좌 테이블>
강좌 이름 | 강의실 | 강좌 허용 인원 |
DB | 110 | 50 |
DS | 111 | 40 |
OS | 111 | 40 |
기본키는 {강좌 이름이}고 위 테이블은 제 1,2 정규형을 만족한다.
현재, 다음과 같은 이행적 종속이 존재한다.
{강좌이름} → {강의실} , {강의실} → {강좌 허용 인원}
따라서, 다음과 같이 분리한다.
<강좌 테이블>
강좌 이름 | 강의실 |
DB | 110 |
DS | 111 |
OS | 111 |
<강의실 테이블>
강의실 | 강좌 허용 인원 |
110 | 50 |
111 | 40 |
위 테이블의 기본키는 각각 {강좌 이름}, {강의실}이다.
💡 만약 분해하지 않았을 경우에는 제 2정규화와 마찬가지로 갱신 이상이 발생할 가능성이 있다.
내가 이해한 것 : 제 2 정규형과 제 3정규형의 차이는 함수 종속의 발생 위치가 복합키인 기본키인가 기본키 이외의 곳인가로 구분 되는 것 같다!
'DB' 카테고리의 다른 글
한 테이블에 클러스터형 인덱스와 보조 인덱스가 동시에 있다면 어떤 구조일까? (0) | 2023.09.07 |
---|---|
MySQL이 인덱스를 이용하는 방법 (0) | 2023.09.07 |
인덱스 키 값의 크기가 조회에 영향을 미치는 요소 (0) | 2023.09.05 |
H2 데이터베이스의 Connection mode (0) | 2023.07.04 |
mysql - 인덱스에 대하여 (0) | 2022.07.05 |