[SQLD] 1과목-2. 데이터 모델과 SQL

seon·2025년 5월 27일

데이터분석

목록 보기
9/10
post-thumbnail

시험 정보

  • 객관식 50문항 (1시간 30분 응시)
  • 총점 60점 이상 합격
  • 1과목: 데이터 모델링의 이해 (10문항, 20점, 과락:8점)
  • 2과목: SQL 기본 및 활용 (40문항, 80점, 과락: 32점)
  • 계) 50문항, 100점

2과목 출제항목

  • 6️⃣ 정규화
  • 7️⃣ 관계와 조인의 이해
  • 8️⃣ 모델이 표현하는 트랜잭션의 이해
  • 9️⃣ Null 속성의 이해
  • 🔟 본질식별자 vs 인조식별자

6️⃣ 정규화

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

정규화(DB Normalization)의 개념

  • 하나의 엔터티에 많은 속성을 넣게 되면, 해당 엔터티를 조회할 때 마다 많은 양의 데이터가 조회될 것이므로 최소한의 데이터만을 하나의 엔터티에 넣는식으로 데이터를 분해하는 과정을 정규화라고 한다.
  • 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성 위한 과정이라고 볼 수 있음
  • 데이터의 이상현상을 줄이기 위한 데이터 베이스 설계 기법
  • 엔터티를 상세화하는 과정으로 논리 데이터 모델링 수행 시점에서 고려됨
  • 제 1 정규화부터 제 5 정규화까지 존재, 실질적으로 제 3 정규화까지만 수행

이상현상(Abnomality)

  • 정규화를 하지 않아 발생하는 현상(삽입이상, 갱신이상, 삭제이상)
  • 특정 인스턴스가 삽입 될 때 정의되지 않아도 될 속성까지도 반드시 입력되어야 하는(삽입이상) 현상이 발생함
    ex) 만약 사원 + 부서 엔터티를 합쳐 놓고 사원번호, 사원이름, 전화번호, 부서번호, 부서명, 부서위치의 속성이 존재할 때 새로운 사원 값이 추가될 때 정해지지 않은 부서정보

정규화 단계

1. 제 1 정규화(1NF)

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

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

  • 예시) 구매 테이블의 제 1 정규화
    상품에 여러 값이 있으므로 이를 여러 인스턴스로 분해
    ➡️ 홍길동과 박길동은 구매상품이 두 값이 입력되어 있으므로 이를 각각 두 행으로 분리하는 작업을 거쳐야 함!

2. 제 2 정규화(2NF)

  • 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해
  • 완전 함수 종속이란, 기본키를 구성하는 모든 컬럼의 값이 다른 컬럼을 결정짓는 상태
  • 기본키의 부분 집합이 다른 컬럼과 1:1 대응 관계를 갖지 않는 상태를 의미
  • 즉, PK(Primary Key)가 2개 이상일 때 발생하며 PK의 일부와 종속되는 관계가 있다면 분리한다.

3. 제 3 정규화(3NF)

  • 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리
  • 이행적 종속성: A->B, B->C의 관계가 성립할 때, A->C가 성립되는 것을 말함
  • (A,B)와 (B,C)로 분리하는 것이 제 3 정규화

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

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

5. 제 4 정규화(4NF)

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

6. 제 5 정규화

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

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

  • 데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법
  • 조회(SELECT) 속도⏫, 데이터 모델 유연성은 ⏬
  • 비정규화 = 정규화를 수행하지 않음을 의미

반정규화 수행 케이스

  • 정규화에 충실하여 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
  • 다량의 범위를 자주 처리해야 하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 요약/집계 정보가 자주 요구되는 경우

7️⃣ 관계와 조인의 이해

관계(Relationship)의 개념

  • 엔터티의 인스턴스 사이의 논리적인 연관성
  • 부모의 식별자를 자식에 상속 -> 상속된 속성을 매핑키(조인키)로 활용 -> 부모-자식을 연결

관계의 분류

  • 관계는 존재에 의한 관계와 행위에 의한 관계로 분류
  • 존재 관계는 엔터티 간의 상태를 의미
    ex) 사원 엔터티는 부서 엔터티에 소속
  • 행위 관계는 엔터티 간의 어떤 행위가 있는 것을 의미
    ex) 주문은 고객이 주문할 때 발생

조인의 의미

  • 정규화에 의해 분리된 두 테이블을 참조하기 위해 데이터를 다시 연결하는 과정

계층형 데이터 모델

  • 자기 자신끼리 관계가 발생. 즉, 하나의 엔터티 내의 인스턴스끼리 계층 구조를 가지는 경우를 말함
  • 계층 구조를 갖는 인스턴스끼리 연결하는 조인을 셀프조인이라함(같은 테이블을 여러 번 조인)

상호배타적 관계

  • 두 테이블 중 하나만 가능한 관계
    ex) 주문 엔터티에는 개인 또는 법인번호 둘 중 하나만 상속될 수 있음 => 상호배타적 관계
    즉, 주문은 개인고객이거나 법인고객 둘 중 하나의 고객만이 가능

8️⃣ 모델이 표현하는 트랜잭션의 이해

트랜잭션이란

  • 하나의 연속적인 업무 단위
  • 트랜잭션에 의한 관계는 필수적인 관계 형태를 가짐
  • 하나의 트랜잭션에는 여러 SELECT, INSERT, DELETE, UPDATE 등이 포함될 수 있음
  • 계좌이체 예시)
    A 고객이 B 고객에게 100 만원을 이체하려고 한다고 가정하자.

    STEP1) A 고객의 잔액이 100 만원 이상인지 확인
    STEP2) 이상이면, A 고객 잔액을 -100 UPDATE
    STEP3) B 고객 잔액에 +100 UPDATE

    이 때, 2 번과 3 번 과정이 동시에 수행되어야 한다.
    즉 모두 성공하거나 모두 취소돼야 함(All or Nothing)
    ☞ 이런 특성을 갖는 연속적인 업무 단위를 트랜잭션이라고 한다.

    ※ 주의

    1. A 고객 잔액 차감과 B 고객 잔액 가산이 서로 독립적으로 발생하면 안됨
      ➡️ 각각의 INSERT 문으로 개발되면 안됨

    2. 부분 COMMIT 불가
      ➡️ 동시 COMMIT 또는 ROLLBACK 처리


필수적, 선택적 관계와 ERD

  • 두 엔터티의 관계가
    • 서로 필수적일 때: 하나의 트랜잭션을 형성
    • 서로 독립적인 수행이 가능하다면: 선택적 관계로 표현
  • IE 표기법)
    • 원을 사용, 필수적/선택적 관계를 구분
    • 필수적 관계: 원x
    • 선택적 관계: 원o (관계선 끝에)
  • 바커 표기법)
    • 실선과 점선으로 구분
    • 필수적 관계: 실선
    • 선택적 관계: 점선

9️⃣ Null 속성의 이해

Null이란

  • DBMS에서 아직 정해지지 않은 값을 의미
  • 0과 빈문자열('')과는 다른 개념
  • 모델 설계 시 각 컬럼별로 NULL을 허용할지를 결정(Nullable Column)

Null의 특성

  1. NULL을 포함한 연산 결과는 항상 NULL
  1. 집계함수는 NULL을 제외한 연산 결과 리턴

Null의 ERD 표기법

  • IE 표기법: NULL 허용여부를 알 수 x
  • 바커 표기법: 속성 앞에 동그라미가 NULL 허용 속성을 의미함


🔟 본질식별자

식별자 구분(대체 여부에 따른)

1. 본질식별자

업무에 의해 만들어지는 식별자 (꼭 필요한 식별자)

2. 인조식별자

  • 인위적으로 만들어지는 식별자
    (꼭 필요하진 않지만 관리의 편의성 등의 이유로 인위적으로 만들어지는 식별자)

  • 본질식별자가 복잡한 구성을 가질 때 인위적으로 생성

  • 주로 각 행을 구분하기 위한 기본키로 사용되며 자동으로 증가하는 일련번호 같은 형태

    1. PK: 주문번호+상품번호
      본질식별자, but 하나의 주문번호로 같은 상품의 주문 결과를 저장x
    2. PK: 주문번호+주문순번(이라는 컬럼을 생성)
      하나의 주문에 대해 여러 상품에 대한 주문 결과 저장 가능
      ➡️ 주문순번으로 인해 구분함
      ➡️ 주문 횟수를 세야한다는 점이 매우 불편!
    3. PK: 주문상세번호(인조식별자 생성)
      주문상세번호로 각 주문이력을 구분 ➡️ 같은 주문의 같은 상품이력이 저장O
      주문상세번호만이 주식별자 ➡️ 나머지 정보들이 불필요하게 중복 저장될 위험
      실제 업무와 상관없는 주문상세번호 ➡️ 쓸데없는 index 생성됨 (PK 생성 시 자동 unique index 생성)
  • 따라서 인조식별자의 단점은,

    • 중복 데이터 발생 가능성 ➡️ 데이터 품질 저하
    • 불필요한 인덱스 생성 ➡️ 저장공간 낭비 및 DML 성능 저하
  • *인덱스: 원래 조회 성능을 향상시키기 위한 객체.
    인덱스는 DML(INSERT/UPDATE/DELETE/INDEX SPLIT) 현상으로 인해 성능이 저하된다.


Reference

profile
🌻

0개의 댓글