ふくふくHukuhuku Inc.
EP.13dbt 11分公開: 2026-05-10

dbt Mesh:大規模組織でプロジェクトを分割し、再利用する

model 数が 数千を超える組織で、1 つの dbt プロジェクトでは限界が来る。dbt Mesh はプロジェクト間で model を「公開・参照」する仕組み。Group / Access / Versioning の使い方。

#dbt#dbt Mesh#大規模化#アーキテクチャ
シェア

プロジェクトが 数千 model を超えると、ビルド時間・PR レビュー・依存把握 すべてが詰まり始めます。dbt Mesh はプロジェクトを 複数に分割し、プロジェクト間で model を「公開・参照」する仕組み。dbt Labs が 2023〜推奨する大規模対応の標準アーキテクチャです。

Mesh の核:3 概念

概念設定目的
Group`schema.yml` の groupmodel を論理グループに括り、所有者を明示
Access`access: private/protected/public`公開範囲制御 (group内/同プロジェクト/他プロジェクト)
Versioning`v1/v2/v3` で同一 model の複数版破壊的変更を後方互換で管理

Group ── 所有者を明示

models/marts/_groups.yml
YAML
version: 2
groups:  - name: commerce    owner:      name: Commerce Team      email: commerce@hukuhuku.co.jp    description: "売上・注文・返品関連のモデル"
  - name: marketing    owner:      name: Marketing Team      email: marketing@hukuhuku.co.jp
  - name: hr_pii    owner:      name: HR Team      email: hr@hukuhuku.co.jp    description: "人事系 (PII 含む、要承認)"
models:  - name: fct_orders    group: commerce  - name: dim_customers    group: commerce  - name: fct_campaigns    group: marketing

Access ── 公開範囲

access意味
`private`同じ group 内からのみ ref 可能
`protected`同じプロジェクト内からのみ ref 可能 (デフォルト)
`public`他プロジェクトからも ref 可能
access の宣言
YAML
models:  - name: dim_customers    group: commerce    access: public          # 他プロジェクトに公開    description: "全社共通の顧客マスタ"
  - name: int_orders__cleaned    group: commerce    access: private         # commerce グループ内のみ

プロジェクト間 ref

marketing プロジェクトの dependencies.yml
YAML
# 別 dbt プロジェクト (commerce) を依存として宣言projects:  - name: commerce_analytics
marketing プロジェクトの model から commerce の dim を参照
SQL
-- models/marts/fct_campaign_orders.sqlSELECT  c.campaign_id,  c.customer_id,  o.amountFROM {{ ref('this_project', 'fct_campaign_attribution') }} cJOIN {{ ref('commerce_analytics', 'dim_customers') }} cust  -- ★ Mesh 越し  USING (customer_id)JOIN {{ ref('commerce_analytics', 'fct_orders') }} o          -- ★ Mesh 越し  USING (customer_id)

Versioning ── 破壊的変更を安全に

公開している model に breaking change を入れたいとき、v1 と v2 を並行運用できる。下流が移行完了したら v1 を deprecate。

model versioning
YAML
models:  - name: dim_customers    access: public    latest_version: 2    versions:      - v: 1        deprecation_date: '2028-12-31'      - v: 2        config:          contract:            enforced: true       # スキーマ契約を強制        columns:          - name: customer_id          - name: name          - name: email          - name: tier            # ★ v2 で追加
下流から版指定で参照
SQL
-- 旧版を使い続けたい場合SELECT * FROM {{ ref('dim_customers', v=1) }}
-- latest を使う (v2)SELECT * FROM {{ ref('dim_customers') }}

Contract ── スキーマ契約を強制

公開モデルにはスキーマ契約
YAML
models:  - name: dim_customers    access: public    config:      contract:        enforced: true           # 違反するとビルド失敗    columns:      - name: customer_id        data_type: string        constraints:          - type: not_null          - type: primary_key      - name: name        data_type: string      - name: created_at        data_type: timestamp        constraints:          - type: not_null
Contract の効果

「カラム名・型・制約を変更すると、ビルドが失敗する」 ように強制できる。下流プロジェクトに 意図しない breaking change を投げない ための保険。

Mesh プロジェクトの分割パターン

パターン分割軸向く組織
ドメイン別commerce / marketing / finance / hr 別ドメインチームが明確 (50〜数百人)
レイヤ別core (共通) + domain-specific プロジェクト中央チーム + 周辺チーム構造
製品別 の各製品ごとマルチプロダクト企業
信頼度別公開 marts / 実験 sandbox「公式 vs 実験」を分けたい

導入の現実的な順序

  1. 1まず group + access: 1 プロジェクト内で grouping を始める (1 ヶ月)
  2. 2Contract 導入: 公開すべき model だけスキーマ契約 (2 週間)
  3. 3Mesh 分割: 最も大きいドメインを切り出して別プロジェクト (1〜2 ヶ月)
  4. 4Versioning: breaking change を入れる時の保険として (継続)
最初から Mesh は overkill

model 数 500 以下、エンジニア 5 人以下なら 1 プロジェクトで十分。Mesh はプロジェクト間調整コストが増えるので、痛みが出てから導入。

次の話

EP.14 では Semantic Layer / Metrics で指標の正本管理を扱います。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp