Bỏ qua để đến nội dung

Model & ref() trong dbt: viên gạch của pipeline dữ liệu

Trong dbt, mọi thứ bắt đầu từ model — và một model đơn giản đến bất ngờ: một file .sql chứa đúng một câu SELECT. dbt lo việc biến câu SELECT đó thành bảng hoặc view trong kho dữ liệu.

Tạo file models/stg_don_hang.sql:

select
id as don_hang_id,
customer_id as khach_hang_id,
created_at as ngay_tao,
amount as gia_tri
from raw.shop.orders
where amount > 0

Chạy dbt run → dbt tạo trong kho dữ liệu một đối tượng tên stg_don_hang. Bạn không viết CREATE TABLE, không quản DDL — chỉ viết logic “dữ liệu trông như thế nào”. Đó là tinh thần dbt: khai báo, không thủ tục.

Thay vì gõ thẳng raw.shop.orders, hãy khai báo nguồn trong file YAML rồi tham chiếu bằng source(). Việc này giúp dbt biết pipeline bắt đầu từ đâu và cho phép kiểm thử/giám sát dữ liệu nguồn.

models/_sources.yml
sources:
- name: shop
schema: raw_shop
tables:
- name: orders
- name: customers
-- models/stg_don_hang.sql
select id as don_hang_id, amount as gia_tri
from {{ source('shop', 'orders') }}

Đây là trái tim của dbt. Khi một model dùng kết quả của model khác, đừng gõ tên bảng — dùng ref():

-- models/mart_doanh_thu.sql
select
khach_hang_id,
count(*) as so_don,
sum(gia_tri) as tong_doanh_thu
from {{ ref('stg_don_hang') }}
group by khach_hang_id

Vì sao ref() quan trọng đến vậy:

Phân lớp model: staging → intermediate → marts

Phần tiêu đề “Phân lớp model: staging → intermediate → marts”

Một dự án dbt gọn gàng thường chia model thành ba lớp:

LớpTiền tốVai trò
Stagingstg_Làm sạch nhẹ từng bảng nguồn (đổi tên, ép kiểu). 1 nguồn → 1 model.
Intermediateint_Ghép nhiều staging, tính toán trung gian, logic nghiệp vụ.
Martsmart_ / fct_ / dim_Bảng cuối phục vụ báo cáo, đúng ngôn ngữ kinh doanh.
flowchart LR
  R["raw"] --> S["stg_*"] --> I["int_*"] --> M["mart_*"] --> BI["📊 BI"]

Khai báo ngay trong model bằng khối config, hoặc trong dbt_project.yml:

{{ config(materialized='table') }}
select ...

Mặc định model là view; đổi sang table, incremental… tùy nhu cầu — xem bài Materialization.

Chia sẻ: