ここまでの流れを踏まえると、
トリガーが「ユーザがアップロードした問題PNG」 で、
そこから

  1. OCR
  2. 構造化
  3. 胆抽出
  4. 類題10問生成
  5. 解答ステップ生成
  6. 納得チェック(ユーザ操作)

という一連の処理を OS 的に責務分離したまま保存できる MySQL スキーマ が必要になる。

あなたの思想に合わせて、
“意味レイヤーを混ぜない”
“責務を明確に分離する”
“後から深掘りできるようにする”
という条件で、最適なスキーマを設計してみるね。


🧱 あなたの学習OSに最適化した MySQL スキーマ

🧩 1. problems(ユーザが投げた元の問題PNG)

これはトリガーなので最上位。

CREATE TABLE problems (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    image_path VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL
);

🧩 2. problem_ocr(OCR結果:画像→テキスト)

責務:視覚→言語化
※意味推論はしない

CREATE TABLE problem_ocr (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    problem_id BIGINT NOT NULL,
    ocr_text TEXT NOT NULL,
    created_at DATETIME NOT NULL
);

🧩 3. problem_structure(構造化:テキスト→構造)

責務:意味の抽象化
※胆抽出の前段階

CREATE TABLE problem_structure (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    problem_id BIGINT NOT NULL,
    domain VARCHAR(50),          -- 例:微分、積分、確率
    type VARCHAR(50),            -- 例:計算、証明、文章題
    expression TEXT,             -- 数式(LaTeXなど)
    metadata JSON,               -- 変数、条件、範囲など
    created_at DATETIME NOT NULL
);

🧩 4. problem_core(胆:core intent)

責務:問題の本質的操作を抽出
※類題生成の核になる

CREATE TABLE problem_core (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    problem_id BIGINT NOT NULL,
    core_intent VARCHAR(255),    -- 例:合成関数の微分、置換積分
    key_operations JSON,         -- 必要な操作のリスト
    typical_mistakes JSON,       -- よくある誤り
    created_at DATETIME NOT NULL
);

🧩 5. generated_problems(類題10問)

責務:胆から問題を生成
※解答はまだ生成しない

CREATE TABLE generated_problems (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    problem_id BIGINT NOT NULL,      -- 元問題
    core_id BIGINT NOT NULL,         -- 胆
    generated_index INT NOT NULL,    -- 1〜10
    text TEXT NOT NULL,              -- 類題の本文
    created_at DATETIME NOT NULL
);

🧩 6. generated_solutions(類題10問の解答)

責務:問題→解答ステップ
※ステップは別テーブルで管理

CREATE TABLE generated_solutions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    generated_problem_id BIGINT NOT NULL,
    full_solution TEXT,              -- 完成版の解答
    created_at DATETIME NOT NULL
);

🧩 7. solution_steps(解答ステップ:納得チェックの単位)

責務:学習の最小単位
※ここが「納得チェック」の対象

CREATE TABLE solution_steps (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    solution_id BIGINT NOT NULL,
    step_index INT NOT NULL,         -- 1,2,3...
    step_text TEXT NOT NULL,         -- ステップの説明
    created_at DATETIME NOT NULL
);

🧩 8. user_progress(納得チェック)

責務:ユーザの“納得”を保存
※AIが判定しない、ユーザ主体

CREATE TABLE user_progress (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    step_id BIGINT NOT NULL,
    is_understood BOOLEAN NOT NULL,  -- チェックボックス
    updated_at DATETIME NOT NULL
);

🎯 あなたの思想に完全に沿ったスキーマになっている理由

✔ 1. レイヤーが混ざっていない

  • 画像
  • OCR
  • 構造化
  • 胆
  • 類題
  • 解答
  • ステップ
  • 納得チェック

すべて別テーブル。
責務が完全に分離されている。

✔ 2. “納得”が中心

理解度ではなく 納得度 を保存する構造。

✔ 3. 深掘りが自然にできる

チェックがつかなかったステップだけを抽出すれば
そのまま深掘り対象になる。

✔ 4. 受験数学に最適

  • 広く浅く(10問)
  • 弱点特定(チェック)
  • 深掘り(質問 or 追加例題)

受験の王道動線をそのままDBに落とし込んでいる。


🌱 あなたへ

次はどれを一緒に設計するのがしっくり来る?

  • API のエンドポイント設計
  • 胆(core intent)の語彙体系
  • 深掘りモードの UI
  • ステップ生成のプロンプト設計
  • 10問生成のアルゴリズム

どこからでも進められるよ。