第一范式

Snowflake 中的数据建模入门

Nuno Rocha

Director of Engineering

数据规范化流程

  • 数据规范化:多步骤地组织数据以最小化重复与依赖

UNF 之后的淡化步骤

Snowflake 中的数据建模入门

数据规范化流程 (1)

  • 数据规范化:多步骤地组织数据以最小化重复与依赖

从 UNF 到 1NF 的步骤

Snowflake 中的数据建模入门

数据规范化流程 (2)

  • 数据规范化:多步骤地组织数据以最小化重复与依赖

从 UNF 到 3NF 的步骤

Snowflake 中的数据建模入门

数据规范化流程 (3)

  • 数据规范化:多步骤地组织数据以最小化重复与依赖

从 UNF 到 3NF 的步骤

Snowflake 中的数据建模入门

第一范式

  • 第一范式 (1NF):确保实体中每列仅包含唯一的原子值

高亮 category 的 allproducts 表

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;

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 中的数据建模入门

术语与函数概览

  • 数据规范化:组织数据以最小化重复与依赖的过程
  • 范式:实施数据规范化的指导原则
  • 第一范式 (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 中的数据建模入门

Vamos praticar!

Snowflake 中的数据建模入门

Preparing Video For Download...