LESSON 25分

ストーリー

高橋アーキテクト
経営者が『売上がなぜ落ちたか』と聞いた時、答えを出せるシステムがあるか?
高橋アーキテクト
ログを見ればわかりますが…時間がかかります
高橋アーキテクト
それでは遅い。分析基盤があれば、数秒でスライスし、ドリルダウンできる。データを武器にするための設計だ

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分