データマートとは、特定の業務部門やユースケースに最適化されたデータストアで、DWHのサブセットとして構築されるケースと独立して構築されるケースがあります。DWHが「倉庫」なら、データマートは「部門ごとの売り場」にあたります。実装自体は難しくない一方で、部門ごとの要望に応えて増やしていくと「マート作りすぎ問題」が発生し、指標が乱立してデータ基盤の信頼性を損ねます。本記事では定義、DWHとの違い、代表的な3つの設計パターン、作りすぎ問題の原因と5つの防止策、dbt時代の設計指針までを解説します。

データマートとは何か――「部門向けに最適化されたデータの窓口」

データマート(Data Mart)とは、特定の業務部門やユースケースのために、分析しやすい形に整形されたデータストアのことです。営業部門向けの売上分析マート、マーケティング部門向けの顧客分析マート、財務部門向けのPLマート――このように、利用者の視点でデータを切り出し、クエリが簡単に書ける状態で提供します。

DWH全体が「巨大な倉庫」なら、データマートは「倉庫から選別して並べた売り場の棚」です。データマートには2種類の生まれ方があります。1つはDWHから派生する「依存型マート(Dependent Data Mart)」で、DWHを単一の情報源とし、そこから部門向けに切り出します。もう1つは「独立型マート(Independent Data Mart)」で、DWHを経由せず直接ソースシステムからデータを取得して構築します。依存型のほうが指標の一貫性を保ちやすく、モダンデータスタックではほぼ依存型一択です。独立型は一見手軽ですが、マート同士で指標定義がずれ、データサイロの温床になります。

データマートとDWHの違い

DWHとデータマートは親子関係にあることが多いですが、性格は大きく異なります。

観点DWHデータマート
スコープ全社横断(エンタープライズ)特定部門・ユースケース
データ量大(全社の履歴データ)小〜中(必要部分のみ)
利用者データエンジニア、アナリスト部門の分析担当、BI利用者
設計の自由度全社ルールに従う部門ニーズに応じて最適化
更新頻度日次〜ニアリアルタイムユースケースに応じて可変
クエリ性能汎用(多目的クエリ向け)ユースケース特化で高速
【DWHとデータマートの関係】

        [ソースシステム群]
        (RDB / SaaS / API / ログ)
                  |
                  v
             [DWH層]
        全社共通の統合データ
                  |
      +-----------+-----------+
      |           |           |
      v           v           v
  [営業マート] [マーケマート] [財務マート]
  売上・受注    顧客・CVR    収益・経費
      |           |           |
      v           v           v
  営業BI       マーケBI      財務BI

※ 依存型マートはDWHを唯一の情報源として派生する

データマートの設計パターン3選

データマートの設計には、代表的な3つのパターンがあります。用途・BIツール・チームスキルによって適する選択が異なります。

パターン1:スタースキーマベース

ファクトテーブル(計測値)とディメンションテーブル(分析軸)で構成する古典的ながら強力な設計です。売上分析ならfct_salesを中心に、dim_customers、dim_products、dim_datesがぶら下がる形になります。JOINの数が少なく、BIツールとの相性が良いのが利点で、Tableau、Looker、Power BIのどれでも素直に接続できます。ディメンショナルモデリングの詳細はA-13で解説しています。

パターン2:ワイドテーブル(One Big Table)

JOINを事前にすべて解消し、1つの巨大な非正規化テーブルに詰め込む設計です。クラウドDWH(BigQuery、Snowflakeなど)のカラムナーストレージと相性が良く、スキャン性能が最速になります。ただし冗長性が増し、ディメンション属性の変更時にはテーブル全体の再生成が必要になるため、更新ロジックの自動化(dbtのincremental models)が前提になります。特定ダッシュボード専用の分析マートでよく採用されます。

パターン3:メトリクスレイヤー(Semantic Layer)

物理的にテーブルを増やすのではなく、指標(Metrics)を定義したセマンティックレイヤーを介して仮想的にマートを提供する設計です。dbt Semantic Layer、Cube、Looker LookMLなどのツールを使い、「売上」「粗利」「LTV」といったビジネス指標をコードで一元定義します。物理マートの増殖を抑え、指標の一貫性を保てるのが最大の利点で、近年この方向が主流になりつつあります。

dbtでスタースキーマのファクトテーブルを定義する例は次のとおりです。

-- models/marts/sales/fct_orders.sql
{{ config(materialized='incremental', unique_key='order_id') }}

SELECT
  o.order_id,
  o.customer_id,
  o.product_id,
  o.order_date,
  o.quantity * p.unit_price AS order_amount
FROM {{ ref('stg_orders') }} o
LEFT JOIN {{ ref('dim_products') }} p USING (product_id)
{% if is_incremental() %}
WHERE o.order_date >= (SELECT MAX(order_date) FROM {{ this }})
{% endif %}
パターン複雑さクエリ性能保守性適するツール
スタースキーマ高(変更に強い)Tableau、Looker、Power BI全般
ワイドテーブル低(クエリ側)最高中(再生成コスト)BigQuery、Snowflake特化
メトリクスレイヤー高(初期設計)中〜高最高(一元管理)dbt Semantic Layer、Cube、LookML

「マート作りすぎ問題」はなぜ起きるのか

データマートは便利ゆえに増殖しやすく、気がつけば数百のマートが乱立してメンテナンス不能になる――これが多くの組織が直面する「マート作りすぎ問題」です。原因は主に3つあります。

  1. 部門ごとの「うちだけのマートが欲しい」要求:「共通マートは汎用すぎて使いづらい」「自分たちの定義で切り直したい」という声が次々と上がり、データエンジニアが要望を断りきれずに類似マートを量産します。
  2. 似て非なるマートの乱立:営業部門の「売上」とCS部門の「売上」で集計期間や返金の扱いが微妙に異なり、結果として同じ名前で異なる数字を返す複数のマートが並びます。経営会議で「うちの数字とあなたの数字が違う」論争の温床になります。
  3. 誰が管理しているかわからないマートの放置:マートを作った担当者が異動・退職し、誰も定義を知らないまま動き続けるマートが放置されます。壊れた際のインパクト評価も困難になり、誰も触れない「聖域」となっていきます。

結果として起きる問題は深刻です。まず指標の不一致が経営の意思決定を混乱させます。次に、使われていないマートがストレージとコンピュートのコストを食い続けます。さらに、上流のDWHに変更が入ったときに、どのマートに影響するかの棚卸しが不可能になり、安全な変更ができなくなります。データ基盤の信頼性とアジリティが同時に失われていく悪循環です。

マート作りすぎを防ぐ5つの施策

予防こそ最良の治療です。以下の5つを組み合わせて運用することで、マートの増殖を抑えつつ、必要なマートが健全に育つ状態を作れます。

  1. メトリクス定義の一元管理(Semantic Layer):指標定義をdbt Semantic LayerやCubeで一元管理し、マート側では物理化された結果を提供する形にします。「売上」の定義が1箇所に集約されることで、部門間の齟齬が構造的に防げます。
  2. マート棚卸しの定期実施:四半期に1度、全マートのオーナー、最終更新日、利用頻度を棚卸しし、3ヶ月以上使われていないマートを削除候補に挙げます。「使われていないマートは負債である」という共通認識を持つことが重要です。
  3. 利用状況の可視化(クエリログ分析):DWHのクエリログからマートごとのアクセス数・ユーザー数を集計し、ダッシュボードで公開します。データが見えれば判断できる、という基本原則をマート運用自体にも適用します。
  4. 命名規約とドキュメンテーションの徹底:fct_、dim_、mart_などのプレフィックス規約と、dbtのschema.ymlによるドキュメント必須化でマートの見通しを保ちます。新規マート作成時にはオーナーと利用目的の記載を必須とします。
  5. データコントラクトの導入:上流DWHとマート間でスキーマ・品質・SLAの契約を結び、変更の影響範囲を明示的に管理します。詳細はA-16 データコントラクトで解説しています。

dbt時代のデータマート設計

dbtの普及によってデータマート設計の常識は大きく変わりました。dbtのモデルレイヤーは典型的に次の3層構造で組まれます。

  • staging層(stg_):ソースシステムからの取り込み直後の軽い整形。1ソース=1モデルが原則。
  • intermediate層(int_):複数のstagingを結合・加工する中間処理。ビジネスロジックを凝集する場所。
  • marts層(fct_ / dim_):最終的な分析用マート。BIツールが直接参照する層。

このレイヤー構造によって、マートの責務が明確になり、依存関係の追跡が容易になります。マートはあくまで「marts層」に限定し、部門要望はintermediate層までで処理するのが規律です。

models/
├── staging/
│   ├── stg_orders.sql
│   ├── stg_customers.sql
│   └── stg_products.sql
├── intermediate/
│   ├── int_orders_enriched.sql
│   └── int_customer_metrics.sql
└── marts/
    ├── sales/
    │   ├── fct_orders.sql
    │   └── dim_customers.sql
    └── marketing/
        └── fct_campaign_performance.sql

まとめ――データマートは「作る」より「管理する」が難しい

  • データマートは特定部門・ユースケース向けに最適化されたデータストアで、DWHのサブセットとして構築するのが現代の主流です。
  • 設計パターンはスタースキーマ、ワイドテーブル、メトリクスレイヤーの3系統で、用途とBIツールに応じて使い分けます。
  • 「マート作りすぎ問題」は部門要望の積み重ねと類似マートの乱立から生まれ、指標の不一致とコスト肥大を招きます。
  • 予防策はメトリクス一元管理、定期棚卸し、利用状況可視化、命名規約、データコントラクトの5つです。
  • dbtの3層構造(staging → intermediate → marts)を守ることが、スケーラブルなマート運用の基礎になります。

併せて読みたい関連記事として、A-12 データモデリングB-01 dbt入門、C-02 3層アーキテクチャをご参照ください。DE-STKでは、マート乱立に苦しむ組織に対してセマンティックレイヤーへの移行支援を行っています。

よくある質問(FAQ)

Q. データマートとDWHの違いは何ですか?

DWHは企業全体のデータを統合する基盤で、データマートは特定部門やユースケースに最適化されたサブセットです。マートはDWHから必要なデータを抽出・加工して構築するのが一般的で、依存型マートと呼ばれます。独立型マートは一見手軽ですが指標の不一致を生みやすいため、現代では依存型が推奨されます。

Q. データマートはいくつ作るべきですか?

正解はありませんが、目安として「ビジネスドメイン単位」で設計するのが推奨です。部門ごとに個別のマートを作ると増殖しやすいため、メトリクス定義の一元管理と定期的な棚卸しが重要です。数百のマートが並んでいる組織は、まずセマンティックレイヤーへの集約を検討するとよいでしょう。

Q. データマートの設計にはどのツールを使いますか?

dbtが最も普及しており、staging→intermediate→martsの3層構造でマートを定義・管理できます。BIツール側のSemantic Layer(LookML、Cube等)を活用する方法もあります。dbt Semantic Layerとの組み合わせで、物理マートを最小化しつつ指標定義を一元化する構成が現在の主流です。