青の統計学-DS Playground-

dbt project 構成:フォルダと materialization

Stage 1 — 第3章 | dbt入門カリキュラム 推定学習時間:30〜40分 | 難易度:★★☆☆☆


この章で学ぶこと

dbt プロジェクトは、フォルダ構成dbt_project.yml で「どこに何を書くか」をチーム共有します。 一般論として、モデル SQL は models/ 配下、test は tests/ や YAML、静的マスタは seeds/ に置く、という整理がよく使われます。

この章では、その一般構造を押さえたうえで、DS Playground の dsplayground_analytics を開いたときに何が見えるかを読み解きます。

この章を終えると、こんなことができるようになります:

  • models/staging / intermediate / marts責務の違い を説明できる
  • dbt_project.yml+materialized 既定が各レイヤーにどう効くか読める
  • tests/seeds/macros/snapshots/役割 を区別できる
  • 次章の source('supabase', ...)どのフォルダ文化 の上に載るか説明できる

dbt プロジェクトのフォルダ構成、dbt_project.yml のレイヤー設定、materialization の既定値を読み解く章です。


1. プロジェクトの基本情報

dsplayground_analyticsdbt_project.yml 冒頭は次のとおりです。

name: dsplayground_analytics
          version: "1.0.0"
          config-version: 2

          profile: dsplayground_analytics

          model-paths:
            - models
          test-paths:
            - tests
          seed-paths:
            - seeds
          macro-paths:
            - macros
          snapshot-paths:
            - snapshots
          analysis-paths:
            - analyses
          
キー 意味
name プロジェクト識別子。models: 配下の設定名前空間にも使う
profile 接続情報の論理名(秘密は profiles.yml / CI 環境変数側
model-paths SQL モデルが置かれるルート(既定 models/
test-paths singular test(SQL ファイル)の置き場
seed-paths CSV など静的マスタの置き場

重要なのは「接続文字列は repo 外」という 境界 です(データマネジメント入門 Stage 5 のガバナンスと同型)。


2. レイヤー別 materialization 既定

同ファイルの models: セクションが、フォルダ名 → マテリアライズ の契約です。

models:
            dsplayground_analytics:
              staging:
                +materialized: view
              intermediate:
                +materialized: view
              marts:
                +materialized: table
          
レイヤー 既定 DS Playground での意図
staging view ソースに近い薄い変換。常に最新の public を反映
intermediate view 複数 staging の統合。ロジック共有用
marts table Metabase が読む完成表。再計算コストを marts build 時に集約

個別モデルで上書きも可能です(例: 日次集計の incremental mart)。 ただし 既定の 3 段 が、レビュー時の「どこまでが BI 公開物か」の目印になります。

production は analytics スキーマ、CI は analytics_ci スキーマに build します。 フォルダ構成は同じでも、書き込み先スキーマだけ が環境で切り替わります。


3. フォルダツリー

次のツリーは、主要パスを 圧縮した概観 です。 実 repo には target/(build 生成物)や logs/ もありますが、Git 管理の本体 は次のとおりです。

dbt/dsplayground/
          ├── dbt_project.yml          # プロジェクト設定・レイヤー既定
          ├── packages.yml             # 外部 dbt パッケージ(利用時)
          ├── models/
          │   ├── overview.md          # dbt docs 用プロジェクト概要
          │   ├── semantic_ontology.md # 会員・アクティブ等の語彙定義
          │   ├── exposures.yml        # Metabase ダッシュボードとの対応(内部)
          │   ├── staging/
          │   │   └── supabase/
          │   │       ├── _supabase__sources.yml
          │   │       ├── _staging__models.yml
          │   │       ├── stg_supabase__consents.sql
          │   │       ├── stg_supabase__problem_attempts.sql
          │   │       └── ...(他の Supabase 生表)
          │   ├── intermediate/
          │   │   └── product/
          │   │       ├── _intermediate__models.yml
          │   │       ├── int_user_activity_events.sql
          │   │       └── int_member_status_current.sql
          │   └── marts/
          │       ├── product/         # 会員・アクティブ・エンゲージメント
          │       ├── content/         # 練習問題品質
          │       └── surveys/         # アンケート・学習目的
          ├── tests/
          │   ├── _tests.yml           # singular test の説明
          │   └── assert_skill_check_total_score_valid.sql
          ├── seeds/
          │   ├── _seeds.yml
          │   └── practice_problem_catalog.csv
          ├── macros/
          │   └── safe_ratio.sql
          ├── snapshots/
          │   └── snapshot_user_learning_preferences.sql
          └── analyses/                # 探索用 SQL(mart には載せない)
          

命名規則の要点:

パターン 意味
stg_<source>__<table> stg_supabase__consents ソースごとの staging
int_<domain>_<entity> int_user_activity_events ドメイン横断の中間
fct_<grain>_<dims> fct_active_users_daily ファクト mart
_<layer>__*.yml _staging__models.yml そのフォルダの schema test 定義

4. models 配下のサブドメイン

marts は ビジネス問い ごとにサブフォルダに分かれています。

フォルダ 主な問い 代表 mart
marts/product/ 会員数、アクティブ、Premium、エンゲージメント fct_membership_daily, fct_active_users_period_summary
marts/content/ 練習問題の正答率・カバレッジ fct_problem_quality, fct_problem_category_quality
marts/surveys/ 学習目的・アンケート選択肢シェア fct_learning_goal_share, fct_member_survey_option_share

staging は ソースシステム単位supabase/)、intermediate は 再利用ロジック単位product/)です。 データアナリティクス入門のマート設計 で学ぶ「1 表 1 問い」が、フォルダ名レベルでも読み取れます。


5. tests / seeds / macros / snapshots

ディレクトリ 内容 DS Playground の例
tests/ singular test(任意 SQL) スコア 0〜100、カタログ被覆
seeds/ リポジトリ内 CSV マスタ practice_problem_catalog
macros/ 再利用 Jinja/SQL safe_ratio(ゼロ除算回避)
snapshots/ SCD Type 2 履歴化 snapshot_user_learning_preferences
analyses/ docs 用・探索用 SQL mart 化前の試行
flowchart TB subgraph repo["Git リポジトリ"] YML[dbt_project.yml] MOD[models/] TST[tests/] SD[seeds/] MAC[macros/] end subgraph ci["GitHub Actions"] RUN[dbt build] end subgraph wh["Supabase / analytics スキーマ"] OUT[marts tables] end YML --> RUN MOD --> RUN TST --> RUN SD --> RUN MAC --> RUN RUN --> OUT

6. docs と語彙ファイル

models/overview.mdsemantic_ontology.md は、dbt docs 生成時に プロジェクトの README 相当 として表示されます。

ファイル 役割
overview.md 主な問い、marts 対応表、運用上の caveats
semantic_ontology.md Member / Active User / Learning Action 等の定義
exposures.yml どの mart がどの Metabase ダッシュボードに載るか(内部)

データマネジメント入門のオントロジー で学ぶ「同じ語を揃える」作業が、analytics 専用の語彙ファイル として repo に存在します。



体系コラム:カリキュラム上の位置づけ

項目 内容
Stage / 章 Stage 1 — 第3章「dbt project 構成」
今回の論点 フォルダと yml が チーム共有の地図 になる
DAMA 領域 メタデータ、データアーキテクチャ
ライフサイクル 加工段階の リポジトリ設計
前章との接続 dbt はデータ可視化基盤のどこにいるのか
次章への伏線 source 定義 — staging の入力


まとめ

パス 一言で
dbt_project.yml レイヤー既定とパスの契約
models/staging/supabase/ source() からの薄い正規化
models/intermediate/product/ 共有ビジネスロジック
models/marts/*/ BI 向け完成表
seeds/ アプリ外の静的マスタ(問題カタログ)
tests/ singular な業務ルール SQL

この章のキーメッセージ:

dbt プロジェクトは SQL ファイルの袋ではなく、レイヤー・命名・yml・テストがセットの設計図 です。 ツリーを読めると、以降の各章で示す SQL 断片の 居場所 が一気に明確になります。


関連教材


確認問題

問題 1

dbt_project.ymlmarts+materialized: table が設定されている主な理由として最も適切なのはどれですか。

A. 本番 OLTP スキーマを table で上書きするため
B. BI ツールが毎回 view チェーンを再計算せず、安定した読み取り先を持つため
C. seed CSV を自動生成するため
D. singular test を marts フォルダにしか置けないため

正解: B

解説: marts を table にすることで、ダッシュボード読み取りを build 時点のスナップショット に寄せ、BI 負荷と定義の安定性を両立します。


問題 2

ファイル stg_app__orders.sql の置き場所として 最も妥当 なのはどれですか。

A. models/marts/sales/
B. models/staging/app/
C. seeds/
D. tests/

正解: B

解説: stg_<source>__<table>staging / ソース単位 の命名です。mart 化は下流の int_ / fct_ が担います。


問題 3

リポジトリ内 CSV から load する静的マスタは、通常どのディレクトリに置きますか。

A. models/staging/
B. seeds/
C. macros/
D. snapshots/

正解: B

解説: アプリ DB ではなく Git 管理の参照データ は seed です。dbt seed で warehouse に載せます。


用語メモ(この章)

用語 意味(この章での使い方)
materialization view / table など、build 結果の物理形
profile 接続先を指す論理名(秘密は repo 外)
singular test tests/ 配下の任意 SQL テスト
schema test _*.yml に宣言する列単位テスト
exposure mart と BI ダッシュボードの対応宣言