면접 준비용
들어가기 전의 SQL 구조 정리
용어 | 설명 |
---|---|
릴레이션 | 테이블, 데이터들을 표로 만든 것 |
튜플 | 테이블, 릴레이션을 이루는 각각의 행 |
도메인 | 하나의 속성이 취할 수 있는 집합, 범위. 도메인을 통해서 데이터 입력 값을 제한할 수 있다. |
정규화(Normalization)란
데이터베이스 설계 과정에서 중복 데이터를 최소화하고 데이터 일관성을 유지하기 위한 원칙. 하나의 테이블에서 너무 많은 정보를 가지지 않도록 어떤 식으로 나누면 될까 제시하는 가이드라인에 가깝다.
중복 데이터를 제거하고 데이터의 무결성(잘못된 데이터가 들어 있지 않도록 하는 것)을 유지하는 데 도움을 준다는 장점이 있으나 너무 많이 쪼갤 경우 JOIN 작업이 많이 필요해져서 속도가 느려질 수 있다. 따라서 적당히 쪼개거나 일부러 합치기도 한다. 합치는 과정을 역정규화(DeNormalization)라고 한다.
- 실무에선 3정규형에서 보이스코드 까지를 주로 사용한다.
제 1 정규화(1NF)
테이블의 칼럼이 원자값을 가지도록 한다.
- 각 컬럼(테이블 내의 한 칸) 내에 데이터 하나만 들어 있도록 해야 하다.
- 각 컬럼의 순서가 상관 없어야 한다.
- 각 컬럼에는 같은 종류나 타입 값을 가져야 한다.
- 각 컬럼이 유일한 이름을 가져야 한다.
EX) |ID|char_id|player_id|inventory| |—|—|—|—| |1|121|333|{무기 : 화승총, 상의 : 뒤틀린 심연의 스파게티 묶음}| |2|223|333|{무기 : 게이볼그, 상의 : 허름한 가죽옷, 신발 : 헤르메스의 신발}|
=>
ID | char_id | player_id | inventory | type |
---|---|---|---|---|
1 | 121 | 333 | 화승총 | 무기 |
2 | 121 | 333 | 뒤틀린 심연의 스파게티 묶음 | 상의 |
3 | 223 | 333 | 게이볼그 | 무기 |
4 | 223 | 333 | 허름한 가죽옷 | 상의 |
5 | 223 | 333 | 헤르메스의 신발 | 신발 |
제 2 정규화(2NF)
제 1 정규화를 지켰다고 했을 때 완전 함수 종속(pk, 고유키를 통헤서만 특정지어질 수 있도록 하기)을 만족하도록 테이블을 분리한다.
ex) |ID|char_id|player_id|inventory|type| |—|—|—|—|—| |1|121|333|화승총|무기| |2|121|333|뒤틀린 심연의 스파게티 묶음|상의| |3|223|333|게이볼그|무기| |4|223|333|허름한 가죽옷|상의| |5|223|333|헤르메스의 신발|신발|
=>
char_id(pk) | player_id |
---|---|
121 | 333 |
223 | 333 |
ID(pk) | char_id | item_id |
---|---|---|
1 | 121 | 1 |
2 | 121 | 2 |
3 | 223 | 3 |
4 | 223 | 4 |
5 | 223 | 5 |
item_id(pk) | name | type |
---|---|---|
1 | 화승총 | 무기 |
2 | 뒤틀린 심연의 스파게티 묶음 | 상의 |
3 | 게이볼그 | 무기 |
4 | 허름한 가죽옷 | 상의 |
5 | 헤르메스의 신발 | 신발 |
제 3 정규화(3NF)
제 2 정규화를 진행한 테이블에 대해 이행적 종속(고유 키보다 다른 키에 더 종속적인 상황, 기본 키에 종속된 다른 키에 종속된 값이 있음)을 해체하도록 한다.
ex)
item_id(pk) | name | type |
---|---|---|
1 | 화승총 | 무기 |
2 | 뒤틀린 심연의 스파게티 묶음 | 상의 |
3 | 게이볼그 | 무기 |
4 | 허름한 가죽옷 | 상의 |
5 | 헤르메스의 신발 | 신발 |
=>
item_id(pk) | name |
---|---|
1 | 화승총 |
2 | 뒤틀린 심연의 스파게티 묶음 |
3 | 게이볼그 |
4 | 허름한 가죽옷 |
5 | 헤르메스의 신발 |
name | type |
---|---|
화승총 | 무기 |
뒤틀린 심연의 스파게티 묶음 | 상의 |
게이볼그 | 무기 |
허름한 가죽옷 | 상의 |
헤르메스의 신발 | 신발 |
보이스/코드 정규형(BCNF)
제 3 정규형을 강화하여 모든 결정자가 후보키 집합에 속한 정규형이다.
후보키 만으로 릴레이션(테이블, 데이터의 표)에서 튜플(릴레이션을 구성하는 각각의 행)을 구할 수 있어야 한다.
단순히 3정규형만 가지고는 다음과 같은 문제가 생길 수 있다.
item_id(pk) | name | type |
---|---|---|
1 | 화승총 | 무기 |
2 | 뒤틀린 심연의 스파게티 묶음 | 상의 |
3 | 게이볼그 | 무기 |
4 | 허름한 가죽옷 | 상의 |
5 | 헤르메스의 신발 | 신발 |
-
삽입 이상 : 무기 카테고리에 다른 무기가 추가되었을 사용자와 연결지으 경우 문제가 생길 수 있다
-
삭제 이상 : id 5번을 삭제하면 신발 헤르메스의 신발이 신발 카테고리라는 정보도 사라진다.
-갱신 이상 : 무기의 타입을 변경할 경우 타입이 변경되면 해당 타입인 행을 모두 찾아 변경해야 한다.
ex)
name | type |
---|---|
화승총 | 무기 |
뒤틀린 심연의 스파게티 묶음 | 상의 |
게이볼그 | 무기 |
허름한 가죽옷 | 상의 |
헤르메스의 신발 | 신발 |
위에서 나눌 때 이런 식으로 나눠진 걸 보이스 코드 정규형으로 부르는 걸로 보인다.
제 4 정규형(4NF)
릴레이션에 따른 다치 종속(과목이 교수를 가리키거나 교수가 과목을 가리키는 경우 등)이 존재하지 않도록 하는 릴레이션
과목-> 교수 테이블
교수-> 과목 테이블
더 잘게 쪼개는 법.
제 5 정규형(5NF)
제 4에서 넘어가 조인 종속을 끊어내는 것.
릴레이션 R에 대해 프로젝트한 n개의 부분집합을 모두 조인하 결과가 이 릴레이션 R과 같다면 R은 조인 종속을 만족한다고 한다.
해당 파트는 아마 정말 극단적인 케이스가 아니면 쓸 일이 없어 보이니 개념 정도만 기억하고 나중에 필요하면 그 때 정리하도록 하자.