자격증/SQLD

SQLD(SQL-Developer) (4)

짱뚱짱 2024. 10. 18. 09:00

💙 식별 관계와 비식별 관계  (⭐굉장히 중요!!)

- 주식별자 키(PK)를 서로 주식별자 키로 갖고 있는지?

- 아니면 강한 개체가 주식별자 키를 가지고, 약한 개체는 이를 주식별자가 아닌 다른 식별자 속성으로 갖고 있는지?

 

1) 식별관계(Identification Relationship)

  - 하나의 엔터티의 기본키를 다른 엔터티가 기본키의 하나로 공유하는 관계

  - 식별관계는 ERD 에서 실선으로 표시

    ex) 사원과 교육이력 엔터티에서 양쪽 모두 기본키 중 일부가 사원번호임

사원 교육이력
# 사원번호 # 사원번호(FK)
# 수강일자

 

2) 비식별관계(Non-identification Relationship)

  - 강한 개체의 기본키를 다른 엔터티의 기본키가 아닌 일반 속성으로 관계를 가지는 것

  - 비식별관계는 ERD에서 점선으로 표시

    ex) 부서사원의 관계에서 부서의 부서번호(기본키)를 사원 엔터티에서는 일반키로 가짐 (사원에서는 사원번호가 기본키)

 

💙 정규화(DB Normalization)의 개념

모델링 시 최대한 중복 데이터를 허용하지 않아야 저장공간의 효율적 사용과 업무 프로세스의 성능을 기대할 수 있다. 이러한 중복 데이터를 허용하지 않는 방식으로 테이블을 설계하는 방식을 정규화라고 한다.

 

- 하나에 엔터티에 많은 속성을 넣게 되면, 해당 엔터티를 조회할 때마다 많은 양의 데이터가 조회될 것이므로 최소한의 데이터만을 하나의 엔터티에 넣는식으로 데이터를 분해하는 과정을 정규화라고 한다.

- 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성 위한 과정이라고 볼 수 있음
- 데이터의 중복을 제거하고 데이터 모델의 독립성을 확보

- 데이터 이상현상을 줄이기 위한 데이터베이스 설계 기법

- 엔터티를 상세화하는 과정으로 논리 데이터 모델링 수행 시점에서 고려됨

- 제 1 정규화부터 제 5 정규화까지 존재, 실질적으로는 제 3 정규화까지만 수행

 

💙 이상현상(Abnormality)

- 정규화를 하지 않아 발생하는 현상(삽입이상, 갱신이상, 삭제이상)

- 특정 인스턴스가 삽입 될 때 정의되지 않아도 될 속성까지도 반드시 입력되어야 하는(삽입이상) 현상이 발생함

  ex) 만약 사원 + 부서 엔터티를 합쳐 놓고 사원번호, 사원이름, 전화번호, 부서번호, 부서명, 부서위치의 속성이 존재할 때 새로운 사원 값이 추가될 때 정해지지 않은 부서정보(부서번호, 부서명, 부서위치) 모두 임의값 또는 NULL이 삽입되어야 함. 반대로 부서가 새로 추가될 경우 소속 사원이 없어도 사원과 관련된 모든 속성이 불필요하게 값이 입력되어야 함.

 

💙 정규화 단계 (⭐굉장히 중요!!)

1. 제 1 정규화(1NF)

  - 테이블이 컬럼이 원자성(한 속성이 하나의 값을 갖는 특성)을 갖도록 테이블을 분해하는 단계

  - 쉽게 말해 하나의 행과 컬럼의 값이 반드시 한 값만 입력되도록 행을 분리하는 단계

 

예시) 구매 테이블의 제 1 정규화

상품에 여러 값이 있으므로 이를 여러 인스턴스로 분해

👉🏻 홍길동과 박길동은 구매상품이 두 값이 입력되어 있으므로 이를 각각 두 행으로 분리하는 작업

2. 제 2 정규화(2NF)

  - 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해

  - 완전 함수 종속이란, 기본키를 구성하는 모든 컬럼의 값이 다른 컬럼을 결정짓는 상태

  - 기본키의 부분 집합이 다른 컬럼과 1:1 대응 관계를 갖지 않는 상태를 의미

  - 즉, PK(Primary Key)가 2개 이상일 때 발생하며 PK의 일부와 종속되는 관계가 있다면 분리한다.

 

    예시) 수강이력 테이블의 제 2 정규화

    기본키(학생번호 + 강의명)중, 강의명에 의해 강의실이 결정 -> 완전 함수 종속성 위에 (부분 함수 종속성을 가짐)

      -> PK와 부분 함수 종속성을 갖는 컬럼을 각각 다른 테이블로 분해!

👉🏻 수강이력에서는 한 학생이 여러 강의를 수강할 수 있기 때문에 주식별자는 학생번호로만은 불가능(유일성 불만족 때문) 따라서 학생번호와 강의명과 결합되어 주식별자가 되어야 한다(한 학생이 같은 강의는 수강할 수 없다고 가정) 이 때, 주식별자의 부분집합인 강의명에 의해 강의실이 달라지는 1 대 1 대응관계를 갖는 것을 완전 함수 종속성 위배, 같은 말로 부분 함수 종속 관계라고 하는데, 제 2 정규화는 이러한 부분 함수 종속성을 깨는 것을 목표로 한다. 따라서 주식별자를 분리할 수 없으니 주식별자는 수강이력에 그대로 있고, 문제가 되는 강의실 컬럼을 주식별자와 분리!

 

3. 제 3 정규화(3NF)

  - 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리

  - 이행적 종속성이란 A -> B, B-> C의 관계가 성립할 때, A -> C가 성립되는 것을 말함
  - (A,B)와 (B,C)로 분리하는 것이 제 3 정규화

 

예시) 구매 테이블 제 3 정규화

고객번호에 의해 상품명이 결정, 상품명에 의해 가격이 결정되는데 

고객번호에 의해서도 구매 가격이 결정됨(고객이 상품을 결정하면 그에 매칭되는 가격이 결정되는 구조이므로)

따라서 (고객번호 + 상품명)과 (상품명 + 가격)으로 분리하는 것이 제 3 정규화!

👉🏻 이 경우 테이블을 분리하지 않으면, 구매 테이블에서 상품명을 변경해야 하는 상황이 발생할 경우 그 때마다 구매 테이블에서도 가격을 변경해야 한다. 하지만 제 3 정규화를 진행하여 테이블을 분리하게 되면, 구매 테이블에서의 상품명만 변경하면 되므로 업데이트에 비효율성이 줄어든다!

 

예시) 학생 테이블의 제 3 정규화

학번은 과목의 결정자이며, 과목은 교수의 결정자이다. 이 때, 학번이 달라지면 그 학번에 의한 교수가 달라지므로 학번 역시 교수의 결정자라고 얘기할 수 있다. 따라서 전공과 교수 컬럼을 분리해야 함.

학생 테이블에서 교수정보가 삭제되고, 따로 과목 테이블이 생기면서 교수의 결정자인 전공과 함께 들어간다.

 

예시) 계좌번호 제 3 정규화

계좌 테이블(분리전)에서 계좌번호가 관리점코드의 결정자이며, 관리점코드 역시 관리점의 결정자인 상태에서 계좌번호에 의해 관리점도 달라지므로 계좌번호 역시 관리점에 대한 결정자이다. 이 때는 PK 외 두 속성을 분리, 따라서 관리점이 계좌 테이블에서 삭제되고, 따로 관리점 테이블로 분리되면서 이의 결정자인 관리점코드가 따라감

 

4. BCNF(Boyce-Codd Normal Form) 정규화

  - 모든 결정자가 후보키가 되도록 테이블을 분해하는 것(결정자가 후보키가 아닌 다른 컬럼에 종속되면 안됨)

 

5. 제 4 정규화

  - 여러 컬럼들이 하나의 컬럼을 종속시키는 경우 분해하여 다중값 종속성을 제거

 

6. 제 5 정규화

  - 조인에 의해서 종속성이 발생되는 경우 분해

 

💙 반정규화=역정규화(De-Normalization)의 개념

- 2024년부터는 시험에서 반정규화에 대한 내용은 빠진다고 되어 있지만, 데이터 베이스를 이해하는 과정에서는 중요한 맥락이므로 짧게나마 보는게 좋음.

- 너무 세세하게 분해해서 조인을 많이 쓰게 되어 성능이 떨어지므로, 분해한 데이터를 다시 결합

- 조회(SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아짐

※ 비정규화는 정규화를 수행하지 않음을 의미

- 반정규화 수행 케이스

    👉🏻 정규화에 충실하여 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우

    👉🏻 다량의 범위를 자주 처리해야 하는 경우

    👉🏻 특정 범위의 데이터만 자주 처리하는 경우

    👉🏻 요약/집계 정보가 자주 요구되는 경우

'자격증 > SQLD' 카테고리의 다른 글

SQLD(SQL-Developer) (6)  (2) 2024.10.28
SQLD(SQL-Developer) (5)  (2) 2024.10.24
SQLD(SQL-Developer) (3)  (4) 2024.10.09
SQLD(SQL-Developer) (2)  (4) 2024.09.27
SQLD(SQL-Developer) (1)  (5) 2024.09.24