제1정규형

Snowflake로 시작하는 데이터 모델링

Nuno Rocha

Director of Engineering

데이터 정규화 과정

  • 데이터 정규화: 중복과 의존성을 최소화하도록 데이터를 구조화하는 다단계 과정

UNF 이후 흐릿한 단계

Snowflake로 시작하는 데이터 모델링

데이터 정규화 과정 (1)

  • 데이터 정규화: 중복과 의존성을 최소화하도록 데이터를 구조화하는 다단계 과정

UNF에서 1NF까지 단계

Snowflake로 시작하는 데이터 모델링

데이터 정규화 과정 (2)

  • 데이터 정규화: 중복과 의존성을 최소화하도록 데이터를 구조화하는 다단계 과정

UNF에서 3NF까지 단계

Snowflake로 시작하는 데이터 모델링

데이터 정규화 과정 (3)

  • 데이터 정규화: 중복과 의존성을 최소화하도록 데이터를 구조화하는 다단계 과정

UNF에서 3NF까지 단계

Snowflake로 시작하는 데이터 모델링

제1정규형

  • 제1정규형(1NF): 각 엔터티의 열이 고유한 원자값만 갖도록 보장

category 강조된 allproducts 테이블

Snowflake로 시작하는 데이터 모델링

제1정규형 (1)

  • UNF 범주의 데이터: 값을 업데이트할 수 있도록 L 범주가 분리되어 있지 않음

L이 포함된 모든 제품 목록

Snowflake로 시작하는 데이터 모델링

제1정규형 (2)

  • 검증 단계: 1NF 준수 여부를 확인하려면 고유값을 조회합니다.
SELECT DISTINCT category 
FROM allproducts;

범주 목록

Snowflake로 시작하는 데이터 모델링

1NF를 위한 Snowflake 함수

  • TRIM
  • LATERAL & FLATTEN
  • SPLIT
Snowflake로 시작하는 데이터 모델링

1NF를 위한 Snowflake 함수

  • TRIM: 값의 시작과 끝 공백을 제거합니다.
SELECT TRIM(category)
FROM allproducts;

category에서 TRIM 함수

Snowflake로 시작하는 데이터 모델링

1NF를 위한 Snowflake 함수

  • TRIM: 값의 시작과 끝 공백을 제거합니다.
  • LATERAL & FLATTEN: 값 목록을 개별 항목의 테이블처럼 처리합니다.
  • SPLIT: 구분자로 값을 분리합니다.
SELECT TRIM(f.value)
FROM allproducts,
LATERAL FLATTEN(INPUT => SPLIT(allproducts.category, ',')) f;

category에서 LATERAL, FLATTEN, SPLIT

Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 1단계: UNF 속성 값을 옮길 새 엔터티를 생성합니다.
CREATE OR REPLACE TABLE categories (
    category_id NUMBER(10,0) PRIMARY KEY,
    category VARCHAR(255)
);
Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 2.1단계: 초기 비정규 엔터티에서 새 엔터티로 데이터 채우기
  • INSERT INTO: 테이블에 새 행을 삽입하는 SQL 명령
INSERT INTO categories (category_id, category)
___;
Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 2.2단계: 초기 비정규 엔터티인 allproducts에서 데이터 선택
INSERT INTO categories (category_id, category)
SELECT 
    ___,
    ___
FROM allproducts;
Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 2.3단계: 특정 속성의 값을 분리하는 함수 사용
INSERT INTO categories (category_id, category)
SELECT 
    ___, 
    TRIM(f.value)
FROM allproducts,
LATERAL FLATTEN(INPUT => SPLIT(allproducts.category, ',')) f;
Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 2.4단계: 고유 식별자를 위해 행 번호 선택
INSERT INTO categories (category_id, category)
SELECT 
    ROW_NUMBER() OVER (ORDER BY TRIM(f.value)), 
    TRIM(f.value)
FROM allproducts,
LATERAL FLATTEN(INPUT => SPLIT(allproducts.category, ',')) f;
Snowflake로 시작하는 데이터 모델링

1NF 적용

  • 2.4단계: 집계를 통해 고유 범주 값 생성
INSERT INTO categories (category_id, category)
SELECT 
    ROW_NUMBER() OVER (ORDER BY TRIM(f.value)), 
    TRIM(f.value)
FROM allproducts,
LATERAL FLATTEN(INPUT => SPLIT(allproducts.category, ',')) f
GROUP BY TRIM(f.value);
Snowflake로 시작하는 데이터 모델링

정규화를 향하여

모든 제품 데이터, UNF에서 1NF로

Snowflake로 시작하는 데이터 모델링

용어 및 함수 요약

  • 데이터 정규화: 중복과 의존성을 최소화하도록 데이터를 구조화하는 과정
  • 정규형: 데이터 정규화 적용 지침
  • 제1정규형(1NF): 각 엔터티의 열이 고유한 원자값만 갖도록 보장
  • INSERT INTO: 테이블에 새 행을 삽입하는 SQL 명령
  • TRIM: 값의 시작과 끝 공백 제거 함수
  • LATERAL FLATTEN(INPUT => SPLIT()): 값을 여러 행으로 분리하는 Snowflake 함수
  • ROW_NUMBER() OVER (ORDER BY): 연속 번호를 생성하는 SQL 함수
  • GROUP BY: 동일 값을 가진 데이터를 집계하는 SQL 절
Snowflake로 시작하는 데이터 모델링

함수 요약

-- 쿼리 결과로 엔터티 채우기
INSERT INTO table_name (column_name, other_columns)
SELECT 
    -- 행 번호로 고유 값 생성
    ROW_NUMBER() OVER (ORDER BY TRIM(alias.value)),
    TRIM(alias.value)
FROM another_table,
-- 구분자를 기준으로 텍스트 속성 분리 
LATERAL FLATTEN(INPUT => SPLIT(another_table.column_name, 'delimiter_value'))alias
-- 고유값 보장을 위해 집계
GROUP BY TRIM(alias.value);
Snowflake로 시작하는 데이터 모델링

Ayo berlatih!

Snowflake로 시작하는 데이터 모델링

Preparing Video For Download...