ストーリー
OLTP vs OLAP
// OLTP (Online Transaction Processing): 業務処理
const OLTP = {
purpose: "日常の業務処理(注文、在庫管理)",
queries: "単一レコードのCRUD操作",
optimization: "書き込み最適化、正規化",
example: "INSERT INTO orders VALUES (...)",
latency: "ミリ秒単位",
database: ["PostgreSQL", "MySQL", "Aurora"],
};
// OLAP (Online Analytical Processing): 分析処理
const OLAP = {
purpose: "ビジネスインテリジェンス、レポーティング",
queries: "大量データの集約・分析",
optimization: "読み取り最適化、デノーマライズ、カラムナー",
example: "SELECT region, SUM(revenue) FROM sales GROUP BY region",
latency: "秒〜分単位",
database: ["BigQuery", "Redshift", "Snowflake", "ClickHouse"],
};
データウェアハウスの設計
スタースキーマ
// スタースキーマ: ファクトテーブル + ディメンションテーブル
interface SalesFactTable {
// ファクト(測定値)
saleId: number;
revenue: number;
quantity: number;
discount: number;
// ディメンションへの外部キー
dateKey: number;
productKey: number;
customerKey: number;
storeKey: number;
}
// ディメンション: 分析の切り口
interface DateDimension {
dateKey: number;
date: Date;
year: number;
quarter: number;
month: number;
dayOfWeek: string;
isHoliday: boolean;
}
interface ProductDimension {
productKey: number;
productName: string;
category: string;
subcategory: string;
brand: string;
price: number;
}
// クエリ例: 2024年Q1の各カテゴリ別売上
// SELECT p.category, d.quarter, SUM(f.revenue)
// FROM sales_fact f
// JOIN date_dim d ON f.dateKey = d.dateKey
// JOIN product_dim p ON f.productKey = p.productKey
// WHERE d.year = 2024 AND d.quarter = 1
// GROUP BY p.category, d.quarter
ハイレベル設計
┌──────────────────────────────────────────────────────┐
│ │
│ [業務DB群]──→[ETL/ELT]──→[データウェアハウス] │
│ │ │
│ ┌──────────┼──────────┐ │
│ ▼ ▼ ▼ │
│ [データマート] [データマート] [データマート] │
│ (マーケ) (財務) (オペレーション) │
│ │ │ │ │
│ └──────────┼──────────┘ │
│ ▼ │
│ [セマンティックレイヤー] │
│ │ │
│ ┌──────────┼──────────┐ │
│ ▼ ▼ ▼ │
│ [BIツール] [ダッシュボード] [アドホック] │
│ Tableau Grafana Jupyter │
│ │
└──────────────────────────────────────────────────────┘
メトリクスレイヤー
// メトリクスの定義を一元管理
interface MetricDefinition {
name: string;
description: string;
formula: string;
dimensions: string[]; // スライスできるディメンション
grain: string; // 集計粒度
}
const METRICS: MetricDefinition[] = [
{
name: "月次売上",
description: "月間の総売上額",
formula: "SUM(revenue) WHERE status = 'completed'",
dimensions: ["地域", "商品カテゴリ", "チャネル"],
grain: "月次",
},
{
name: "顧客獲得コスト(CAC)",
description: "新規顧客1人あたりの獲得コスト",
formula: "SUM(marketing_spend) / COUNT(DISTINCT new_customers)",
dimensions: ["チャネル", "キャンペーン"],
grain: "月次",
},
{
name: "解約率",
description: "月間解約率",
formula: "COUNT(churned_users) / COUNT(active_users_start)",
dimensions: ["プラン", "地域", "利用期間"],
grain: "月次",
},
];
リアルタイム分析
// リアルタイムダッシュボードの構成
class RealTimeAnalytics {
// マテリアライズドビュー: 事前集計で高速クエリ
materializedViews = {
hourlyRevenue: "毎時の売上サマリー(自動更新)",
activeUsers: "リアルタイムのアクティブユーザー数",
errorRate: "直近5分間のエラー率",
};
// 時系列データベース
timeSeriesDB = {
tool: "InfluxDB / TimescaleDB / Prometheus",
useCase: "メトリクスの時系列保存と高速クエリ",
retention: "高解像度(1秒)は7日、低解像度(1時間)は1年",
};
}
まとめ
| ポイント | 内容 |
|---|---|
| OLTP vs OLAP | 業務処理と分析処理は別システムで設計 |
| スタースキーマ | ファクト + ディメンションで多次元分析 |
| メトリクスレイヤー | ビジネスメトリクスの定義を一元管理 |
| リアルタイム分析 | マテリアライズドビュー + 時系列DB |
チェックリスト
- OLTPとOLAPの違いを説明できた
- スタースキーマの設計方法を理解した
- データマートの役割を把握した
- リアルタイム分析の実現方法を理解した
次のステップへ
次は演習です。データ処理システムの設計に挑戦しましょう。
推定読了時間: 25分