CDP フレームワーク設計書

v5 2026-05-22
レイヤー定義
レイヤー役割結合ルール
Base 型変換のみ。ビジネスロジックなし JOIN禁止。ソース別に独立
Staging カテゴリ × システム単位で清浄化・標準化
例: stg_crm_customer, stg_ma_customer
同一ソース内JOINのみ可
Intermediate dbt内部モデルで3段階処理(事業→会社→会社間)
外部公開は1ドメイン1テーブル
クロスソースJOIN可
(唯一の統合ポイント)
Mart 分析・BI向け集計(ユースケース別) int_* から読み込みのみ。追加JOIN禁止
データフロー
源泉システム
← DB分割 →
← スキーマ分割(DWH内)→
システム
Raw
Base
STG(×4)
Intermediate
Mart
会社A
事業a
システム1[DB_sys1]
raw_1
base_1
stg_1_顧客
stg_1_契約
stg_1_商品
システム2[DB_sys2]
raw_2
base_2
stg_2_顧客
stg_2_契約
stg_2_商品
事業b
システム3[DB_sys3]
raw_3
base_3
stg_3_顧客
stg_3_契約
stg_3_商品
システム4[DB_sys4]
raw_4
base_4
stg_4_顧客
stg_4_契約
stg_4_商品
会社B
事業a
システム5[DB_sys5]
raw_5
base_5
stg_5_顧客
stg_5_契約
stg_5_商品
システム6[DB_sys6]
raw_6
base_6
stg_6_顧客
stg_6_契約
stg_6_商品
会社C
事業a
システム7[DB_sys7]
raw_7
base_7
stg_7_顧客
stg_7_契約
stg_7_商品
事業b
システム8[DB_sys8]
raw_8
base_8
stg_8_顧客
stg_8_契約
stg_8_商品
顧客
int_顧客_id
int_顧客_detail
契約
int_契約_id
int_契約_detail
商品
int_商品_id
int_商品_detail
Mart(顧客)
Mart(契約)
Mart(商品)

※ Raw列は事業会社ごとに独立したDB(DB分割)。Base〜Mart列はDWH内スキーマ分割。Raw〜STGは各事業会社内で独立(他社データ不参照)。クロスソースJOINはIntermediate層のみ許可。

※ 1事業×1システムは会社Cのさらに縮退ケース(sys7のみ)として実現可能

スキーマテーブル構造
Base
システムごとにスキーマ分割
会社A
事業a
schema: base_sys1
  • 顧客マスタ
  • 契約情報
schema: base_sys2
  • 商品マスタ
事業b
schema: base_sys3
  • 顧客マスタ
  • 契約情報
schema: base_sys4
  • 商品マスタ
会社B
事業a
schema: base_sys5
  • 顧客マスタ
  • 契約情報
schema: base_sys6
  • 商品マスタ
会社C
事業a
schema: base_sys7
  • 顧客マスタ
  • 契約情報
事業b
schema: base_sys8
  • 顧客マスタ
  • 商品マスタ
源泉テーブル群(複数)→ 4カテゴリに集約 →
STG
システムごとにスキーマ分割
会社A
事業a
schema: stg_sys1
  • 顧客
  • 契約
  • 商品
schema: stg_sys2
  • 顧客
  • 契約
  • 商品
事業b
schema: stg_sys3
  • 顧客
  • 契約
  • 商品
schema: stg_sys4
  • 顧客
  • 契約
  • 商品
会社B
事業a
schema: stg_sys5
  • 顧客
  • 契約
  • 商品
schema: stg_sys6
  • 顧客
  • 契約
  • 商品
会社C
事業a
schema: stg_sys7
  • 顧客
  • 契約
  • 商品
事業b
schema: stg_sys8
  • 顧客
  • 契約
  • 商品
n スキーマ → 1スキーマに収束 →
Int
共有スキーマ1本
schema: int
  • 顧客_id
  • 顧客_detail
  • 契約_id
  • 契約_detail
  • 商品_id
  • 商品_detail
Intermediate テーブル設計
テーブル名種別概要
int_顧客_id IDスパイン cdp_customer_id ↔ 各ソースIDのマッピング。名寄せキーの正本
int_顧客_detail ワイドテーブル 全ソースの顧客属性を列挙。競合属性はMartで選択
int_契約_id IDスパイン 契約IDの名寄せマッピング
int_契約_detail ワイドテーブル 各事業の契約テーブルを統合した参照ビュー
int_商品_id IDスパイン 商品IDの名寄せマッピング
int_商品_detail ワイドテーブル 事業別独立商品マスタ。横断参照のみ
設計方針: 各カテゴリ(顧客・契約・商品)に _id(IDスパイン)と _detail(ワイドテーブル)の2本立て。_id はマッピングのみ保持し、_detail に全ソース属性を列挙。競合属性はMartで選択ロジックを持つ。
Intermediate 層 サンプルデータ

各テーブルの構造を示すダミーデータ(2〜3行)。見出しをクリックで開閉できます。

_id テーブル(縦持ち・IDスパイン)

int_顧客_id — 顧客 ID スパイン(各ソースの顧客 ID を縦に集約)
cdp_顧客_idsource_systemsource_顧客_id
CDP-C-00001sys1SYS1-CUST-001
CDP-C-00001sys3S3-C-9981
CDP-C-00002sys2SYS2-USER-047
int_契約_id — 契約 ID スパイン(各ソースの契約 ID を縦に集約)
cdp_契約_idcdp_顧客_idsource_systemsource_契約_id
CDP-K-00101CDP-C-00001sys1SYS1-CON-5501
CDP-K-00101CDP-C-00001sys4S4-K-0077
CDP-K-00102CDP-C-00002sys2SYS2-CON-3320
int_商品_id — 商品 ID スパイン(各ソースの商品 ID を縦に集約)
cdp_商品_idcdp_契約_idsource_systemsource_商品_id
CDP-P-00301CDP-K-00101sys1SYS1-PROD-801
CDP-P-00301CDP-K-00101sys5S5-ITEM-042
CDP-P-00302CDP-K-00102sys3SYS3-PROD-115

_detail テーブル(横持ち・ワイドテーブル)

int_顧客_detail — 顧客属性ワイドテーブル(全ソースの顧客属性を横に並べる)
cdp_顧客_id sys1_氏名sys1_メール sys2_氏名sys2_メール sys3_氏名sys3_メール
CDP-C-00001 山田 太郎yamada@sys1.example YAMADA Tarotaro.yamada@sys3.example
CDP-C-00002 佐藤 花子sato@sys2.example
CDP-C-00003 鈴木 一郎suzuki@sys1.example 鈴木 一i.suzuki@sys2.example
int_契約_detail — 契約属性ワイドテーブル(全ソースの契約属性を横に並べる)
cdp_契約_id cdp_顧客_id sys1_契約種別sys1_開始日 sys2_契約種別sys2_開始日 sys4_契約種別sys4_開始日
CDP-K-00101 CDP-C-00001 賃貸2024-04-01 賃貸(月極)2024-04-01
CDP-K-00102 CDP-C-00002 売買2023-11-15
CDP-K-00103 CDP-C-00003 管理委託2025-01-01 PM委託2025-01-01
int_商品_detail — 商品属性ワイドテーブル(全ソースの商品属性を横に並べる)
cdp_商品_id cdp_契約_id sys1_商品名sys1_カテゴリ sys2_商品名sys2_カテゴリ sys5_商品名sys5_カテゴリ
CDP-P-00301 CDP-K-00101 渋谷区桜ヶ丘201号室賃貸マンション 桜丘 #201RENT_APART
CDP-P-00302 CDP-K-00102 新宿区西新宿土地A売買用地
CDP-P-00303 CDP-K-00103 港区白金パーキング駐車場 白金PK-B駐車場
Int層 ID紐付け処理ロジック

Int層のID(cdp_顧客_id、cdp_契約_id、cdp_商品_id)は、各ソースシステムのキーを統合スパインテーブルにJOINすることで解決される。以下にその処理フローを示す。

顧客↔契約の紐付け: 各ソースシステムの契約テーブルにはソース顧客IDが含まれる。STG層でその関係を保持し、Int層で int_顧客_id スパインを JOIN することで cdp_顧客_id を解決し、int_契約_id / int_契約_detail に付与する。
契約↔商品の紐付け: 各ソースシステムの商品テーブルにはソース契約IDが含まれる。同様に int_契約_id スパインを JOIN することで cdp_契約_id を解決し、int_商品_id / int_商品_detail に付与する。

ID解決フロー

【顧客→契約 ID解決】
ソース顧客ID (source_顧客_id)
  ↓ int_顧客_id スパインに JOIN
cdp_顧客_id を取得
  ↓ int_契約_id / int_契約_detail に付与
int_契約_detail.cdp_顧客_id ← 解決済みID
【契約→商品 ID解決】
ソース契約ID (source_契約_id)
  ↓ int_契約_id スパインに JOIN
cdp_契約_id を取得
  ↓ int_商品_id / int_商品_detail に付与
int_商品_detail.cdp_契約_id ← 解決済みID
処理ステップ JOIN元(スパイン) 解決されるID 付与先テーブル
ステップ1: 顧客ID解決 int_顧客_id cdp_顧客_id int_契約_id, int_契約_detail
ステップ2: 契約ID解決 int_契約_id cdp_契約_id int_商品_id, int_商品_detail