SQL : 데이터 모델과 SQL

Skele·2025년 5월 12일

SQL

목록 보기
2/11
post-thumbnail

1. 정규화(DB Normalization)

1.1 개념

데이터의 중복을 제거하고 데이터를 최소 단위로 분해하는 과정으로, 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 확보하기 위한 과정이다. 데이터 이상현상을 줄이기 위한 데이터베이스 설계 기법이며, 엔터티를 상세화하는 과정으로 논리 데이터 모델링 수행 시점에서 고려된다.

1.2 이상현상(Abnormality)

정규화를 하지 않아 발생하는 현상으로, 세 가지 유형이 있다:

  • 삽입이상: 불필요한 데이터까지 함께 입력해야 하는 현상
  • 갱신이상: 중복 데이터 중 일부만 변경하여 일관성이 깨지는 현상
  • 삭제이상: 필요한 데이터까지 함께 삭제되는 현상

1.3 정규화 단계

정규화 단계핵심 내용제거 대상예시
제1정규화(1NF)테이블의 컬럼이 원자성을 갖도록 분해한 컬럼에 여러 값 존재하나의 연락처 컬럼에 여러 번호가 있는 경우를 분리
제2정규화(2NF)부분 함수 종속 제거기본키의 일부에만 종속되는 속성학생번호+과목코드→성적, 과목코드→교수명에서 교수명을 별도 테이블로 분리
제3정규화(3NF)이행적 종속 제거A→B, B→C일 때 A→C 관계학번→학과코드, 학과코드→학과명에서 학과명을 별도 테이블로 분리
BCNF모든 결정자가 후보키가 되도록 분해후보키가 아닌 결정자교수가 한 과목만 강의할 때, 과목→교수 관계를 별도 테이블로 분리
제4정규화다중값 종속성 제거여러 컬럼이 하나의 컬럼을 종속시키는 경우학생이 여러 과목과 여러 취미를 가질 때 발생하는 중복
제5정규화조인 종속성 제거조인에 의해 종속성이 발생하는 경우복잡한 다대다 관계의 분해

1.4 반정규화(De-Normalization)

데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다. 시스템의 성능 향상, 개발 및 운영의 단순화를 위해 정규화된 데이터 모델을 중복, 통합, 분리하는 기법이다. 조회(SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아진다.

2. 관계와 조인의 이해

2.1 관계(Relationship)

엔터티의 인스턴스 사이의 논리적인 연관성을 의미한다. 엔터티의 정의, 속성 정의 및 관계 정의에 따라 다양하게 변할 수 있다. 관계는 존재에 의한 관계와 행위에 의한 관계로 분류할 수 있다.

2.2 조인(Join)

결국 데이터의 중복을 피하기 위해 테이블은 정규화에 의해 분리된다. 분리되면서 두 테이블은 서로 관계를 맺게 되고, 다시 이 두 테이블의 데이터를 동시에 출력하거나 관계가 있는 테이블을 참조하기 위해 데이터를 연결하는데 이 과정을 조인이라고 한다.

2.3 계층형 데이터 모델

  • 정의: 자기 자신끼리 관계가 발생하는 형태로, 하나의 엔터티 내의 인스턴스끼리 계층 구조를 가지는 경우를 말함
  • 특징: 같은 테이블 내에서도 상위-하위 관계가 발생함
  • 구현방법: 셀프조인(같은 테이블을 여러 번 조인)을 사용하여 구현
  • 예시: 조직도(상급자-하급자), 댓글-대댓글, 카테고리-하위카테고리 등

2.4 상호배타적 관계

  • 정의: 두 테이블 중 하나만 가능한 관계를 말함
  • 특징: 한 부모 엔터티가 두 개 이상의 자식 엔터티와 관계를 가지지만, 특정 인스턴스는 자식 엔터티 중 하나와만 관계를 맺는 경우
  • 표현방법: IE 표기법에서 원 안에 'X'로 표시
  • 예시:
    개인고객/법인고객: 주문은 개인고객 또는 법인고객 중 하나에만 연결됨
    정규직/계약직: 직원은 정규직이나 계약직 중 하나만 될 수 있음

3. 트랜잭션

3.1 트랜잭션(Transaction)

하나의 연속적인 업무 단위를 말한다. 트랜잭션에 의한 관계는 필수적인 관계 형태를 가지며, 하나의 트랜잭션에는 여러 SELECT, INSERT, DELETE, UPDATE 등이 포함될 수 있다. 계좌이체를 예로 들면, A 고객이 B 고객에게 이체할 때 A 고객 잔액 차감과 B 고객 잔액 증가가 모두 성공하거나 모두 실패해야 한다(All or Nothing).

3.2 필수적, 선택적 관계와 ERD

관계 유형의미IE 표기법바커 표기법예시
필수적 관계
(Mandatory)
• 두 엔터티의 관계가 서로 필수적일 때 하나의 트랜잭션을 형성
• 반드시 관계를 가져야 함
• 항상 연관된 엔터티가 존재해야 함
관계선 끝에 원이 없음실선으로 표기부서-부서장(부서에는 반드시 부서장이 있어야 함)
선택적 관계
(Optional)
• 두 엔터티가 서로 독립적 수행이 가능
• 관계가 없을 수도 있음
• 연관된 엔터티가 없어도 됨
관계선 끝에 원을 그림점선으로 표기고객-주문(고객이 주문을 하지 않을 수도 있음)

4. NULL 속성의 이해

4.1 NULL이란

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

4.2 NULL의 특성

비교 연산자 (=, <>, >, <, >=, <=)

  • NULL과의 모든 비교 연산은 UNKNOWN 반환

ANY/SOME 연산자

  • NULL을 포함한 목록에서 하나라도 조건을 만족하면 TRUE
  • 모든 값이 조건을 만족하지 않고 NULL만 있으면 UNKNOWN

DISTINCT

  • NULL 값들은 서로 같은 것으로 처리됨

집계 함수

  • SUM, AVG, MIN, MAX, COUNT(컬럼명) 등은 NULL 무시
  • COUNT(*)는 NULL 행도 포함
  • GROUP BY 시 NULL은 하나의 그룹으로 묶임

CASE 표현식

  • CASE WHEN 조건 THEN 결과 ... ELSE NULL END에서 조건이 NULL이면 WHEN절 조건은 FALSE로 처리됨

집합 연산자 (UNION, INTERSECT, MINUS)

  • NULL 값들은 서로 같은 것으로 처리됨
  • UNION, INTERSECT, MINUS에서 NULL 행들은 중복 처리됨

논리 연산자 (AND, OR, NOT)

  • NULL AND TRUE = UNKNOWN
  • NULL AND FALSE = FALSE
  • NULL OR TRUE = TRUE
  • NULL OR FALSE = UNKNOWN
  • NULL OR NULL = UNKNOWN
  • NOT NULL = UNKNOWN

NVL / ISNULL

  • Oracle: NVL(컬럼, 대체값)
  • SQL Server: ISNULL(컬럼, 대체값)
  • 주의점:
    • 두 번째 인자의 데이터 타입으로 반환됨
    • 치환값의 데이터 타입은 원본 컬럼과 호환되어야 함
    • NVL(숫자컬럼, '문자') 같이 타입이 다르면 오류 발생

NVL2

  • 구문: NVL2(컬럼, NULL아닐때값, NULL일때값)
  • 주의점:
    • NULL이 아닐 때와 NULL일 때 다른 값 반환 가능
    • 세 번째 인자의 데이터 타입으로 반환됨

COALESCE

  • 구문: COALESCE(값1, 값2, 값3, ...)
  • 특징:
    • 처음으로 NULL이 아닌 값을 반환
    • NVL보다 유연하고 가독성 좋음
  • 주의점:
    • 모든 인자가 NULL이면 NULL 반환
    • 인자들의 데이터 타입이 호환되어야 함

NULLIF

  • 구문: NULLIF(값1, 값2)
  • 특징:
    • 값1과 값2가 같으면 NULL 반환, 다르면 값1 반환
  • 주의점:
    • NVL과 용도가 반대 (NULL을 만들어내는 함수)
    • 0으로 나누는 오류 방지 등에 활용

DECODE

  • Oracle 전용: DECODE(컬럼, 조건1, 결과1, 조건2, 결과2, ..., 기본값)
  • 주의점:
    • NULL 비교 시 '=' 연산자처럼 동작하지 않고, NULL 값 동등 비교 가능
    • DECODE(컬럼, NULL, '널값', '널아님') : 실제로 NULL 비교 가능

CONCAT

  • 구문: CONCAT(문자열1, 문자열2)
  • 주의점:
    • 인자 중 하나가 NULL이면 다른 인자만 반환
    • 두 인자 모두 NULL이면 NULL 반환

LENGTH / LEN

  • 구문: LENGTH(문자열) / LEN(문자열)
  • 주의점: NULL 입력 시 NULL 반환

TO_DATE / CONVERT

  • 구문: TO_DATE(문자열, 포맷) / CONVERT(DATE, 문자열, 포맷)
  • 주의점: NULL 입력 시 NULL 반환, 변환 실패 시 오류

CASE WHEN

  • 구문:
    CASE 
       WHEN 조건1 THEN 결과1
       WHEN 조건2 THEN 결과2
       ELSE 기본값
    END
  • 주의점:
    • NULL 조건은 항상 FALSE로 평가
    • NULL 비교는 IS NULL 사용해야 함
    • ELSE 생략 시 NULL 반환

4.3 NULL의 ERD 표기법

  • IE 표기법에서는 NULL 허용여부를 알 수 없음
  • 바커 표기법에서는 속성 앞에 동그라미가 NULL 허용 속성을 의미함
profile
Tireless And Restless Debugging In Source : TARDIS

0개의 댓글