table은 현실세계를 그대로 반영한 저장소로, 관계형 데이터베이스에서 데이터를 관리하고 저장하는 장소이다(=집합의 개념).
Data의 효율적인 관리와 적절한 조작이 중요하다.
설계 규칙은 정규화 위배사항 분석을 통해 진행하면 되지만, 이를 위해 기본적으로 생각해야할 사항이 있다.
집합을 어떻게 분리할 것인가?
→ 일반회원? 프리미엄 회원?
행(Record) 식별자는 어떻게 구성할 것인가?
→ 기본키
table은 함수이다.
Normalization, table을 정의하는 기본 형태이자 규칙을 일컫는다. 이러한 규칙을 지키지 않았을때 발생하는 문제 상황을 정규화 위배(위반)이라 한다.
또한 table에서 각 행(data)을 구별할 수 있고, 특정 table을 통해 특정 값을 확보하기 위해 사용하는 인자가 바로 PK이다.
Query의 핵심은 이러한 PK를 통해 table을 거쳐 최종적인 result를 받아오는 것, 즉 하나의 "함수"처럼 동작하도록 구성하는 것이 가장 큰 핵심이라 할 수 있겠다.
쉽게 말하면 기본키를 입력하면 특정 출력값이 나오는 구조를 생각하고, 이러한 구조를 준수하는 것이 정규화의 시작으로 이해하면 좋다.
원자성, table의 data에는 여러 값(항목)을 동시에 포함할 수 없다.
위와 같은 data 구성이 있을때, "연락처" 항목에 두개의 정보가 동시에 존재한다(핸드폰 번호, 이메일 주소).
이때 동시에 존재하는 정보(항목)을 나누어, 하나의 속성에 하나의 항목만 존재하도록 구성한다.
부분함수 종속의 상황
PK가 복합키(여러개의 column, 속성)로 구성되어 있을때 오직 하나의 열(부분함수)을 통해 결과를 도출할 수 있으면 안된다(반드시 복합키로만 도출 가능해야 함).
위와 같은 table 구성이 있다고 가정하고, 이 table에 대해 분석을 진행해보자(PK는 고객ID와 주문번호).
위 질문에서 1번은 "그렇다"이다. 하지만 2,3번은 어떠한가?
2,3번 질문에 대한 대답은 "굳이?"가 될 것이다.
즉, 굳이 고객ID와 주문번호를 통해 도출하는 것이 아니라 고객ID만을 통해서도 고객명과 고객등급을 도출할 수 있을 것이다.
또한, 고객ID와 주문번호를 통해서만 고객명과 고객등급이 나와야한다면 위 table을 작성할때는 고객명과 고객등급은 기본키가 아니므로 중복이 가능하며 이에 따라 Data 관리에 번거로움이 발생하게 된다.
이렇게 PK 일부를 통해서만 결과를 도출할 수 있는 경우를 부분함수종속, 2정규화 위배라 한다.
※ 복합키든 1개의 키든 주어진 키를 통해서만 데이터를 도출할 수 있어야 한다.
이러한 부분함수종속 문제를 해결하기 위해 모든 열이 기본키를 통해서만 함수종속을 가지도록 구성하면 된다.
위 구성처럼 고객명과 고객등급은 고객ID를 통해서만 도출할 수 있는 구조를 구축한다면 2정규화 위배를 해소할 수 있다.
기본키를 제외한 일반 column에서 함수 종속이 발생하는 경우
말 그대로 기본키 이외의 열에서 함수종속, 결과도출이 발생하는 경우를 일컫는다.
이때 고객ID를 PK라고 하였을때, 부분함수종속은 없지만 직업코드를 통해 직업명을 도출할 수 있는 구조가 생긴다.
이러한 3정규화 위반은 table을 각각 개별적으로 구성하면 해결할 수 있다.
패스트캠퍼스 - 데이터베이스와 SQLD