第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 への allproducts データ

Snowflakeで学ぶデータモデリング入門

用語と関数の概要

  • データ正規化: 重複と依存を最小化するためにデータを構造化
  • 正規形: データ正規化を適用するための指針
  • 第1正規形 (1NF): 各列が重複のない原子的な値を持つことを保証
  • INSERT INTO: テーブルに新行を挿入
  • TRIM: 値の先頭と末尾の空白を削除
  • LATERAL FLATTEN(INPUT => SPLIT()): 値を行に分割する Snowflake 関数
  • ROW_NUMBER() OVER (ORDER BY): 連番を生成
  • GROUP BY: 同じ値を持つデータを集約
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...