dbt

dbt モデルの access 設計ガイド: public / protected / private の使い分け

2026-04-19
NicheeLab編集部

dbt の access は、モデルを ref できる範囲を制御するプロパティで、設計段階の一貫性と変更の安全性を高めます。特にレイヤード・アーキテクチャ(staging / intermediate / marts)と組み合わせると、依存関係の境界が明確になり、拡張時の影響評価が容易になります。

本稿では public / protected / private の基本、よくある設計パターン、YAML 実装例、CI での検証ポイントをまとめます。dbt Analytics Engineer 認定の出題傾向(モデルの境界、contracts・versions との併用、grants との違い)にも触れます。

access の基本と使い分け

access は主にモデルで利用するリソースプロパティで、他のパッケージやプロジェクトからの ref 対象にできるかを制御します。dbt はコンパイル時に access 違反を検出し、意図しない参照をブロックします。

基本的な方針は、staging は private、統合・中間層は protected、消費者向けのマートは public です。これにより、変更の影響半径を段階的に抑えられます。

  • private: もっとも閉じた範囲。原材料データや不安定な中間形を保護
  • protected: プロジェクト内や定義した境界内のみで共有。過度な公開を抑止
  • public: 外部パッケージからの参照も許可。API 的な安定インターフェース
レベル参照できる範囲(概念)主な用途と注意点
private同一パッケージ内のみstaging・試験的中間。再利用性は下がるが変更が安全
protected同一パッケージ内(+定義した境界)統合・中間。外部からの直接参照を抑え、境界運用が重要
public全パッケージからマートや公開 API。変更は慎重に。versions/contract と併用推奨

レイヤード設計パターン(stg / int / mart)

もっとも実務で安定するのは、レイヤごとに access を固定するやり方です。これにより、意図しない逆参照やスキップ参照(stg → mart の直参照など)を抑止できます。

別パッケージからは mart の public のみを参照可能とし、int(protected)は境界外から触れない前提にします。

  • stg_*: private(ソース形状変動・命名揺れに耐える)
  • int_*: protected(集約・正規化・キー付与などの中間)
  • mart_*: public(キュレーション済み、契約とバージョンを明確化)

依存関係と公開境界(例)

OKBLOCKEDstg_*privateint_*protectedmart_*public (公開API)package_b: model_xref(a.mart_*) → OKpackage_b: model_yref(a.int_*) → BLOCKEDprivate=同一パッケージ内のみ, protected=境界内のみ, public=外部も可

実装例(YAML)と基本検証フロー

以下は、同一プロジェクト内でレイヤごとに access と group を付与した例です。contracts と versions を組み合わせ、public モデルの安定性を高めます。

access 違反は dbt のコンパイル〜ビルド時に検出されます。CI では依存パッケージを含めて dbt build を実行し、違反でジョブを失敗させます。

  • group はドキュメンテーションや境界の意図表示に有用(命名を一貫)
  • public には contract と version を併用し、互換破壊は新バージョンで提供
  • CI で依存含め build し、access 違反を早期検出

models/schema.yml(例)

version: 2
models:
  - name: stg_orders
    description: Raw orders from source, lightly cleaned
    config:
      access: private
      group: staging
      contract:
        enforced: true
    columns:
      - name: order_id
        data_type: int
      - name: order_ts
        data_type: timestamp

  - name: int_orders
    description: Conformed orders, with keys and normalized types
    config:
      access: protected
      group: integration
    columns:
      - name: order_id
        tests: [not_null]

  - name: dim_customers
    description: Curated customer dimension (public interface)
    config:
      access: public
      group: marts
      contract:
        enforced: true
    versions:
      - v: 1
      - v: 2
    latest_version: 2
    columns:
      - name: customer_id
        data_type: int
      - name: customer_tier
        data_type: string

複数プロジェクト/パッケージ間の公開戦略

他パッケージから参照される前提のモデルは public に限定します。protected や private を外部から ref しようとすると、dbt はビルド前の段階で違反として検出します。

公開対象の変更時は、互換破壊と非互換を切り分けます。互換破壊は新しい version として提供し、latest_version を切り替えるまでの併走期間を設ける運用が安全です。

  • 外部公開=public。非公開=protected/private
  • 破壊的変更=新バージョン、非破壊=同バージョンで列追加(contractに注意)
  • 依存側の更新タイミングを吸収するため、旧版の寿命を明示的に管理

access と他機能の関係(contracts・versions・grants)

access は「dbt 内の参照可否」を制御します。データベースの読み取り権限は grants(アダプタ実装)で別管理です。public でも、倉庫側の権限が無ければ直接 SQL では読めません。

contracts はスキーマ整合性、versions はインターフェースの時間的互換性を担保します。public モデルでは3点セット(access+contract+version)が実運用・試験双方での模範解答に近いです。

  • access: dbt の ref ガード(設計上の境界)
  • grants: 倉庫上の実権限。BI/外部ツールへの露出に影響
  • contracts/versions: 公開 API の互換性を管理(列・型・進化)

試験対策と落とし穴

Analytics Engineer 認定では、層ごとの公開範囲、access・contracts・versions の組み合わせ、grants との違いが頻出です。シナリオ文から「誰が使うか」「どこまで公開するか」を判断してください。

protected と private の違いを混同しないこと、public を安易に増やさないこと、破壊的変更時は versioning を使うことが要点です。

  • レイヤ別のデフォルト: stg=private / int=protected / mart=public
  • public には contract と version を添える(互換性を設計)
  • access は ref 可否、grants は倉庫権限という役割分担を明確に

問題で確認

Analytics Engineer

問題 1

複数のチームが同一データプラットフォーム上で dbt プロジェクトを分離運用しています。Team A の中間層モデル int_orders は外部から直接参照してほしくありませんが、Team A 内では自由に参照したい。一方、顧客向けマート dim_customers は Team B からも参照されます。適切な access の組み合わせはどれですか。

  1. A. int_orders=protected、dim_customers=public
  2. B. int_orders=private、dim_customers=protected
  3. C. int_orders=public、dim_customers=protected
  4. D. int_orders=private、dim_customers=private

正解: A

外部パッケージからの直接参照を防ぐ中間層は protected、外部公開のマートは public が適切。private は同一パッケージ内でも用途が限定されるため、中間層の共有には不向き。

よくある質問

access を設定すると、倉庫上の SELECT 権限も制御できますか?

いいえ。access は dbt の ref 可否を制御する設計上のガードです。倉庫上の権限は grants(アダプタ依存の実装)で管理します。

public モデルの破壊的変更はどう扱うべきですか?

versions を使って新バージョンとして提供し、contract を併用して互換性を明示します。依存側の移行期間を設け、latest_version の切替タイミングを管理します。

protected と private の実務上の使い分けは?

private は原材料や実験的な形を閉じ込める用途、protected は同一プロジェクト内での共有中間層に適します。外部公開は public のみに限定します。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
dbt

dbt Model の基礎: SQL で定義する変換の最小単位

Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...

dbt

dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点

dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...

dbt

dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点

dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...

dbt

dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト

Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....

dbt

dbt_project.yml の読み方:主要設定と命名を最短で掴む

dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...

dbtの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.