の最大の発明は `ref()` 関数です。テーブル名を直接書く代わりに `ref('model_name')` と書くことで、dbt は 依存関係グラフ ( の DAG) を自動構築し、環境別の正しいテーブル名を解決し、並列実行スケジュールを最適化します。
ref() の挙動
-- model: marts/dim_customers.sqlSELECT * FROM {{ ref('stg_customers') }}
-- dev 環境では:-- → SELECT * FROM dbt_dev_yourname.stg_customers
-- prod 環境では:-- → SELECT * FROM analytics_prod.stg_customers
-- CI 環境では:-- → SELECT * FROM ci_pr_42.stg_customersテーブル名のハードコードを避けることで、環境切替が dbt 側で勝手に行われる。これが「ローカルで開発し、PR で CI ビルド、merge で prod 反映」のフローを成立させる土台。
source() との使い分け
| 関数 | 参照先 | 使う場所 |
|---|---|---|
| `source('schema', 'table')` | dbt の外で作られた生テーブル( で取込済み) | staging のみ |
| `ref('model_name')` | dbt 内で作った model | staging/intermediate/marts 全部 |
marts や intermediate で `source()` を直接使うと、staging レイヤをバイパスする model ができる。これは 「同じソーステーブルを複数の場所で型変換する」事故の元。1 source = 1 staging model = ref() 経由でしか触らない を徹底。
依存グラフ (DAG) の確認
# ドキュメント生成 → ブラウザで lineage グラフ確認dbt docs generatedbt docs serve
# CLI で依存を見るdbt list --select +fct_orders --output json | jq '.[].depends_on'
# 特定 model に到達する全 modeldbt list --select +fct_orders --resource-type modelref() の便利な使い方
1. version 指定
-- 旧バージョンを残しつつ新バージョンに移行SELECT * FROM {{ ref('dim_customers', v=2) }}2. パッケージ越しの参照
SELECT * FROM {{ ref('dbt_utils', 'dim_calendar') }}3. project 越しの参照(dbt Mesh)
-- {{ ref('別プロジェクト名', 'モデル名') }}SELECT * FROM {{ ref('marketing_analytics', 'dim_campaigns') }}依存設計の落とし穴
`A → B → A` のような循環は dbt がエラーで弾く。意図せず出るのは大体 model 設計の問題。A から B の集計値を持ち戻すようなケースは、別 model に切り出す。
5 段以上の `ref` 連鎖は、変更影響が見えづらく、ビルド時間も長くなる。intermediate を 1〜2 段に抑える設計が現実的。
incremental model では `this` で自テーブル参照ができるが、これを通常 model でやるとエラー。Incremental 用途以外では使わない。
ベストプラクティス
- `source` は staging だけ、他レイヤは必ず `ref()`
- 1 staging model = 1 source table、JOIN しない
- intermediate は最大 1 段、それ以上は marts に直接
- marts どうしの ref() は最小限 ── 上下関係が崩れる
- lineage を毎回確認: 新 model 追加時は `dbt docs serve` で意図したグラフか目視
次の話
EP.05 では materialization 4 種 (view / table / incremental / ephemeral) の使い分けを扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。