🎓 レベル:標準 | 重要度:A(必須)
📎 前提:レイクハウスとテーブルフォーマット・SQL変換とdbt | 関連:データ品質とテスト・スタースキーマと次元モデリング
要点(BLUF)
- メダリオンアーキテクチャは、データを**bronze(生)→ silver(整形・クレンジング)→ gold(集計・提供)**の3層で段階的に磨く設計パターン。
- 各層の責務を分けることで、再処理・再現・デバッグが容易になる。源の生(bronze)を残すので、変換ロジックが変わってもsilver以降を作り直すだけで済む。
- ELT(→ ETLとELT)とレイクハウス(→ レイクハウスとテーブルフォーマット)の実践形。dbtのstaging/intermediate/mart(→ SQL変換とdbt)とほぼ同じ思想。
概念 ── 段階的に品質を上げる
一気に「生→提供」を作ると、変換が一枚岩になりテストも再処理も困難です。メダリオンは間に「整形済み(silver)」を挟み、各層に明確な役割を与えます。
flowchart LR
SRC["ソース"] --> B["bronze(生のまま・履歴保持)"]
B --> S["silver(型整え・重複/NULL除去・結合)"]
S --> G["gold(集計・次元モデル・提供用)"]
G --> BI["BI・ML・分析"]
| 層 | 責務 | 例 |
|---|---|---|
| bronze | 生をそのまま蓄積(監査・再処理の起点) | 取り込んだログ・CDCの生レコード |
| silver | クレンジング・標準化・結合 | 重複排除・NULL処理・型変換・名寄せ |
| gold | ビジネス集計・次元モデル | 商品別日次売上・KPI・スタースキーマ |
仕組み ── bronze → silver → gold を実演
生データ(重複・NULL・文字列の金額)を、層ごとに磨きます。
-- silver: NULL除去 + order_id重複の代表行 + 型変換
CREATE TABLE silver_sales AS
SELECT order_id, product, CAST(amount AS INTEGER) AS amount, ymd
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY raw_id) rn
FROM bronze_sales WHERE amount IS NOT NULL)
WHERE rn = 1;
-- gold: 商品別・日別の売上集計
SELECT ymd, product, SUM(amount) AS sales, COUNT(*) n
FROM silver_sales GROUP BY ymd, product ORDER BY ymd, sales DESC;
実行結果(実機・SQLite):
bronze(生) : 6 行
silver(整形済み) : 4 行(重複1・NULL1を除去)
gold(集計) :
('2026-06-01', 'Coffee', 900, 1)
('2026-06-01', 'Cake', 800, 1)
('2026-06-02', 'Cake', 1600, 1)
('2026-06-02', 'Coffee', 1500, 1)
bronzeの6行(汚れ込み)が、silverで4行(重複1・NULL1を除去)に整い、goldで提供用の集計になります。各層が「1つの責務」だけを果たすので、どこで何をしたかが明快です。
設計の勘所 ── 層の規律
- bronzeは不変(immutable)に近く扱う:生を改変せず追記。ここを残すことが再処理の保険。
- 品質ゲートを層の境に置く:bronze→silverで入口テスト、silver→goldで整合・値域テスト(→ データ品質とテスト)。
- goldは利用者向けに非正規化:スタースキーマ(→ スタースキーマと次元モデリング)など、読みやすく速い形に。
- 冪等な再生成:各層をパーティション上書きで作り直せるように(→ べき等性と再実行)。
なぜそうするか ── 責務分離が再処理を生む
なぜ3層に分けるのか。変更と障害に強くなるからです。変換ロジックを直したいとき、生(bronze)が残っていれば silver/gold を作り直すだけ。源に取りに戻らずに済みます。バグを見つけたときも、「bronzeは正しいがsilverがおかしい」と層で切り分けられ、原因特定が速い。一枚岩の変換では、この「どこで壊れたか」が分からず、源から全部やり直しになりがちです。層の数(3つ)より、各層に単一責務を与えることが本質です。
⚠️ よくある落とし穴
- bronzeを整形してしまう → 再処理の起点を失う。生は生のまま残す。
- silverを飛ばしてbronzeから直接gold → 変換が一枚岩化しテスト不能に。中間層を必ず挟む。
- 層を増やしすぎる(過剰な細分化)→ 管理コスト増。3層を基本に、必要なら intermediate を足す程度。
- 層の境にテストを置かない → 汚染が下層へ伝播。境界が品質ゲート(→ データ品質とテスト)。
対応ラボ
data-engineering-study/labs/05_warehouse_lakehouse.py(PYTHONIOENCODING=utf-8 で実行・bronze/silver/goldの行数と集計を確認済み)。
関連
- 載せる基盤は レイクハウスとテーブルフォーマット、変換のコード化は SQL変換とdbt
- 各層の品質ゲートは データ品質とテスト、goldの形は スタースキーマと次元モデリング
- 再生成の冪等性は べき等性と再実行