第一正規化

Snowflake 資料建模入門

Nuno Rocha

Director of Engineering

資料正規化流程

  • 資料正規化:多步驟結構化資料,以降低重複與相依性

UNF 之後的淡化步驟

Snowflake 資料建模入門

資料正規化流程(1)

  • 資料正規化:多步驟結構化資料,以降低重複與相依性

從 UNF 到 1NF 的步驟

Snowflake 資料建模入門

資料正規化流程(2)

  • 資料正規化:多步驟結構化資料,以降低重複與相依性

從 UNF 到 3NF 的步驟

Snowflake 資料建模入門

資料正規化流程(3)

  • 資料正規化:多步驟結構化資料,以降低重複與相依性

從 UNF 到 3NF 的步驟

Snowflake 資料建模入門

第一正規化

  • 第一正規化(1NF):確保每個實體欄位皆為唯一的原子值

已反白顯示類別的所有產品表

Snowflake 資料建模入門

第一正規化(1)

  • UNF 類別資料:L 類別未被獨立,無法直接更新其值

含有 L 的所有產品清單

Snowflake 資料建模入門

第一正規化(2)

  • 驗證步驟:查詢唯一值以評估是否符合 1NF。
SELECT DISTINCT category 
FROM allproducts;

類別清單

Snowflake 資料建模入門

1NF 的 Snowflake 函式

  • TRIM
  • LATERAL 與 FLATTEN
  • SPLIT
Snowflake 資料建模入門

1NF 的 Snowflake 函式

  • TRIM:移除值開頭與結尾的空白
SELECT TRIM(category)
FROM allproducts;

類別中的 TRIM 函式

Snowflake 資料建模入門

1NF 的 Snowflake 函式

  • TRIM:移除值開頭與結尾的空白。
  • LATERAL 與 FLATTEN: 將值清單視為含個別項目的資料表。
  • SPLIT:依分隔符拆分值。
SELECT TRIM(f.value)
FROM allproducts,
LATERAL FLATTEN(INPUT => SPLIT(allproducts.category, ',')) f;

類別中的 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 資料建模入門

術語與函式總覽

  • 資料正規化:結構化資料以降低重複與相依性
  • 正規化形式:執行資料正規化的準則
  • 第一正規化(1NF):確保每個實體欄位皆為唯一的原子值
  • INSERT INTO:將新列插入資料表的 SQL 指令
  • TRIM:移除值開頭與結尾空白的 SQL 函式
  • 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 資料建模入門

一起來練習吧!

Snowflake 資料建模入門

Preparing Video For Download...