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.
Một model = một câu SELECT
Phần tiêu đề “Một model = một câu SELECT”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_trifrom raw.shop.orderswhere amount > 0Chạ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.
source() — khai báo bảng nguồn
Phần tiêu đề “source() — khai báo bảng nguồn”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.
sources: - name: shop schema: raw_shop tables: - name: orders - name: customers-- models/stg_don_hang.sqlselect id as don_hang_id, amount as gia_trifrom {{ source('shop', 'orders') }}ref() — nối các model lại
Phần tiêu đề “ref() — nối các model lại”Đâ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.sqlselect khach_hang_id, count(*) as so_don, sum(gia_tri) as tong_doanh_thufrom {{ ref('stg_don_hang') }}group by khach_hang_idVì 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ớp | Tiền tố | Vai trò |
|---|---|---|
| Staging | stg_ | Làm sạch nhẹ từng bảng nguồn (đổi tên, ép kiểu). 1 nguồn → 1 model. |
| Intermediate | int_ | Ghép nhiều staging, tính toán trung gian, logic nghiệp vụ. |
| Marts | mart_ / 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"]
Cấu hình model (materialization, schema…)
Phần tiêu đề “Cấu hình model (materialization, schema…)”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.