[SQLD/P] table 설계와 정규화

Hyo Kyun Lee·2022년 7월 29일
0

SQLD/P

목록 보기
8/82

1. table 설계의 기초

table은 현실세계를 그대로 반영한 저장소로, 관계형 데이터베이스에서 데이터를 관리하고 저장하는 장소이다(=집합의 개념).

Data의 효율적인 관리와 적절한 조작이 중요하다.

2. table 설계 규칙

설계 규칙은 정규화 위배사항 분석을 통해 진행하면 되지만, 이를 위해 기본적으로 생각해야할 사항이 있다.

  • 집합을 어떻게 분리할 것인가?
    → 일반회원? 프리미엄 회원?

  • 행(Record) 식별자는 어떻게 구성할 것인가?
    → 기본키

3. 정규화

table은 함수이다.

Normalization, table을 정의하는 기본 형태이자 규칙을 일컫는다. 이러한 규칙을 지키지 않았을때 발생하는 문제 상황을 정규화 위배(위반)이라 한다.

또한 table에서 각 행(data)을 구별할 수 있고, 특정 table을 통해 특정 값을 확보하기 위해 사용하는 인자가 바로 PK이다.

Query의 핵심은 이러한 PK를 통해 table을 거쳐 최종적인 result를 받아오는 것, 즉 하나의 "함수"처럼 동작하도록 구성하는 것이 가장 큰 핵심이라 할 수 있겠다.

쉽게 말하면 기본키를 입력하면 특정 출력값이 나오는 구조를 생각하고, 이러한 구조를 준수하는 것이 정규화의 시작으로 이해하면 좋다.

3-1. 1정규화 위반(1NF)

원자성, table의 data에는 여러 값(항목)을 동시에 포함할 수 없다.

위와 같은 data 구성이 있을때, "연락처" 항목에 두개의 정보가 동시에 존재한다(핸드폰 번호, 이메일 주소).

이때 동시에 존재하는 정보(항목)을 나누어, 하나의 속성에 하나의 항목만 존재하도록 구성한다.

3-2. 2정규화 위반(2NF)

부분함수 종속의 상황

PK가 복합키(여러개의 column, 속성)로 구성되어 있을때 오직 하나의 열(부분함수)을 통해 결과를 도출할 수 있으면 안된다(반드시 복합키로만 도출 가능해야 함).

위와 같은 table 구성이 있다고 가정하고, 이 table에 대해 분석을 진행해보자(PK는 고객ID와 주문번호).

  1. 주문일자는 고객ID와 주문번호를 통해 도출될 수 있는가?
  2. 고객명은 고객ID와 주문번호를 통해 도출될 수 있는가?
  3. 고객등급은 고객ID와 주문번호를 통해 도출될 수 있는가?

위 질문에서 1번은 "그렇다"이다. 하지만 2,3번은 어떠한가?

2,3번 질문에 대한 대답은 "굳이?"가 될 것이다.
즉, 굳이 고객ID와 주문번호를 통해 도출하는 것이 아니라 고객ID만을 통해서도 고객명과 고객등급을 도출할 수 있을 것이다.

또한, 고객ID와 주문번호를 통해서만 고객명과 고객등급이 나와야한다면 위 table을 작성할때는 고객명과 고객등급은 기본키가 아니므로 중복이 가능하며 이에 따라 Data 관리에 번거로움이 발생하게 된다.

이렇게 PK 일부를 통해서만 결과를 도출할 수 있는 경우를 부분함수종속, 2정규화 위배라 한다.

※ 복합키든 1개의 키든 주어진 키를 통해서만 데이터를 도출할 수 있어야 한다.

이러한 부분함수종속 문제를 해결하기 위해 모든 열이 기본키를 통해서만 함수종속을 가지도록 구성하면 된다.

위 구성처럼 고객명과 고객등급은 고객ID를 통해서만 도출할 수 있는 구조를 구축한다면 2정규화 위배를 해소할 수 있다.

3-3. 3정규화 위반(3NF)

기본키를 제외한 일반 column에서 함수 종속이 발생하는 경우

말 그대로 기본키 이외의 열에서 함수종속, 결과도출이 발생하는 경우를 일컫는다.

이때 고객ID를 PK라고 하였을때, 부분함수종속은 없지만 직업코드를 통해 직업명을 도출할 수 있는 구조가 생긴다.

이러한 3정규화 위반은 table을 각각 개별적으로 구성하면 해결할 수 있다.

4. 참고자료

패스트캠퍼스 - 데이터베이스와 SQLD

0개의 댓글