📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

CRUD図と機能設計の考え方

概要

  • 日程: Day 8 / セッション 1
  • 時間: 09:30-09:55(25分)
  • 形式: 座学
  • ゴール: CRUD図の役割(機能とテーブルの対応を見える化し設計漏れを発見する)と機能設計書に書くべき項目(入力チェック・ボタン動作・初期設定)を挙げられ、CRUD図で設計漏れを発見する手順を実例で説明できる
  • 学習形式: 対話型解説、ケーススタディ

導入(5分)

昨日(Day 7)はテーブル定義書とER図を作りました。データの入れ物と、入れ物どうしの関係が見えてきました。

ここで質問です。作ったテーブルは、すべての機能から正しく使われているでしょうか?

  • 「会員テーブルはあるけど、会員登録機能を作り忘れていないか?」
  • 「お気に入りテーブルがあるのに、誰も登録できないのでは?」
  • 「予約テーブルに Delete機能が無い。本当に削除不要?」

これに答える道具が CRUD図 です。今日のセッションでは、CRUD図と機能設計書の役割を学びます。

内部設計の現在地

flowchart LR A["テーブル定義書 (Day7)"] --> B["ER図 (Day7)"] B --> C["CRUD図 (今日)"] C --> D["機能設計書 (今日)"] D --> E["内部設計書 完成"]

本編(15分)

1. CRUD図とは

CRUD図は、機能(行)とテーブル(列)の交点に C/R/U/D を書き込んだマトリクスです。「どの機能がどのテーブルに対して何をするか」を1枚で見える化します。

CRUD図の例(会員予約システム)

機能\テーブル members shops reservations
会員登録 C - -
会員ログイン R - -
店舗一覧表示 - R -
予約作成 R R C
予約一覧表示 R R R
予約変更 R R U
予約キャンセル R - D
会員情報更新 U - -
会員退会 D - D

CRUDの意味

記号 操作 SQL
C Create(作成) INSERT
R Read(参照) SELECT
U Update(更新) UPDATE
D Delete(削除) DELETE

2. CRUD図で発見できる設計漏れ

CRUD図の真の価値は、設計漏れを発見できる点にあります。次のパターンを見つけたら要注意です。

パターンA:列に C(Create)が無いテーブル

そのテーブルにデータが生まれない=誰も登録できない

例:shops 列に C が無い → 「店舗マスタはどうやって登録するの?」管理者用の店舗登録機能が抜けている可能性。

パターンB:列に R(Read)が無いテーブル

そのテーブルが誰にも読まれない=そもそもデータが必要か疑問。

例:logs 列に R が無い → 書き込むだけで読まないなら、本当にDBに保存する必要があるか再考。

パターンC:列に D(Delete)が無いテーブル

意図的に残すなら問題なし。意図しないなら漏れ。

例:reservations 列に D が無い → ユーザは予約キャンセルできない仕様か?要件再確認。

パターンD:行に C/R/U/D が偏っている機能

「予約作成」機能が R だけだったら? Create を忘れている。

パターンE:使われていないテーブル(列が空)

そもそもそのテーブルは不要かもしれない。

3. ケーススタディ:設計漏れを見つける

以下のCRUD図を見て、設計漏れを3つ見つけてみましょう。

機能\テーブル members products orders favorites
会員登録 C - - -
商品一覧 - R - -
商品詳細 - R - -
注文 R R C -
お気に入り表示 R R - R

問いかけ:気になる点は?

→ 解答例

  1. products 列に C/U/D が無い → 商品マスタ管理機能が漏れている
  2. favorites 列に C/D が無い → お気に入りを追加・削除する機能が無い(表示だけ)
  3. orders 列に R/U/D が無い → 注文履歴の閲覧・キャンセルができない

ここがポイント

  • CRUD図は マトリクスの空白に意味がある
  • 意図して空白」と「漏れの空白」を区別する
  • 漏れを見つけたら 外部設計書まで遡って修正(画面一覧・機能一覧)

4. 機能設計書とは

機能設計書は、各機能の中身(処理ロジック)を実装者向けに記述した文書です。次の3要素を必ず書きます。

(1) 項目の入力チェック

  • 必須/任意
  • 型・桁数
  • フォーマット(メール形式・電話番号形式・日付形式)
  • 値の範囲(数値の上下限)
  • 既存データとの整合性(一意性チェックなど)

例:会員登録機能

項目 必須 桁数 形式 エラー時メッセージ
氏名 YES string 50以下 - 「氏名を入力してください」
メール YES string 100以下 RFC5322 「メールアドレスの形式が正しくありません」
パスワード YES string 8〜32 英数字 「8文字以上32文字以下で入力してください」

(2) ボタンの動作

  • 押したときに何が起きるか
  • どのテーブルに対して C/R/U/D を行うか
  • 成功時の遷移先・表示
  • 失敗時のメッセージ・遷移先

例:会員登録ボタン

  1. 入力チェック(上記)。エラーがあれば同画面で表示
  2. メールアドレスの重複チェック(members テーブルを SELECT)。重複ありなら「既に登録済みです」
  3. パスワードをハッシュ化
  4. members テーブルに INSERT
  5. 成功時:ログイン画面へ遷移、「登録完了」メッセージ
  6. 失敗時:同画面で「登録に失敗しました。時間をおいて再試行してください」

(3) 初期設定

  • 画面表示時のデフォルト値
  • 表示順序(並び順)
  • 初期表示件数(ページネーション)
  • 非表示/読み取り専用にする項目

例:予約一覧画面

  • 表示順:予約日時の降順
  • 1ページの表示件数:20件
  • 過去の予約は薄いグレー文字で表示
  • 未来の予約のみ「キャンセル」ボタンを表示

5. 異常系を必ず設計する

機能設計でよく抜けるのが 異常系 です。

異常系の種類
空入力 全項目空のままボタンを押される
桁オーバー 100文字想定の項目に1万文字
不正な値 数値項目に「abc」、メール項目に「@@@」
競合 同じメールで同時に2人が登録ボタンを押す
権限なし 他人の予約を変更しようとする
ネットワーク断 送信途中で通信が切れる

「ユーザは仕様書通りに使わない」が大前提。異常系を設計してこそ、ユーザに優しいシステムになります。

コラム:CRUD図の起源

CRUD図のアイデアは1980年代の構造化分析(James Martin らの Information Engineering)に遡ります。「機能 × データ」のマトリクスで設計の全体性を担保する考え方は、当時から変わっていません。アジャイル時代になっても、全機能と全テーブルが1枚に収まる図の効力は健在です。1枚見れば設計のバランスが分かる、これがCRUD図の長く愛される理由です。

💬 AIに聞いてみよう

  • 「私たちの機能一覧(貼り付け)とテーブル定義書(貼り付け)から CRUD 図のたたき台を作って」
  • 「次のCRUD図(貼り付け)から設計漏れの候補を5件挙げて」
  • 「会員登録機能の異常系を10個挙げて。よくある順に」
  • 「機能設計書の項目漏れチェックリストを作って」

まとめ(5分)

今日のセッション要点を3つに絞ります。

  1. CRUD図は 機能とテーブルの対応マトリクス。空白から設計漏れを発見する道具
  2. 機能設計書には 入力チェック・ボタン動作・初期設定を必ず書く
  3. 異常系(空入力・桁オーバー・競合) を必ず設計する

次のセッション(Session 2)では、自チームのCRUD図を実際に作り、設計漏れを1件以上見つけて修正します。

🔄 振り返りチェック

  • CRUD図の役割を1文で説明できる
  • CRUDのそれぞれの意味とSQLを対応づけられる
  • 設計漏れの典型パターンを3つ挙げられる
  • 機能設計書の3要素を挙げられる
  • 異常系の例を3つ挙げられる

補足資料

  • 前日資料:Day7_Session01_内部設計とDBMS_正規化の考え方.mdDay7_Session03_ER図の作成.md
  • Day5 機能一覧(自チーム成果物)
  • Day7 テーブル定義書(自チーム成果物)

学習ガイド

想定される質問と回答例

質問 ヒント
CRUD図を毎回作るのは大変では? 機能・テーブル数が10程度なら15分で書ける。設計漏れ発見の費用対効果が高い
1機能で複数テーブルに同じ操作(CCC)がある場合は? そのまま全部書く。トランザクションが必要なヒントになる
機能設計書はどこまで詳細に書く? 「実装者が見て迷わない」を目安に。コードに近すぎるとメンテが大変、抽象的すぎると実装で困る
異常系をすべて設計するのは無理では? 「空入力・桁オーバー・形式違反・競合・権限なし」の5観点をチェックリスト化すれば抜けにくい
ボタンの動作は画面仕様書と重複しない? 画面仕様書は「見た目」、機能設計書は「中身」。視点が違うので両方必要

つまずきやすいポイント

つまずきポイント ヒント
CRUDの C と U を区別できていない C は新規行を作る、U は既存行を更新する。upsert(あれば更新・なければ作成)は CU と書く流派もある
「論理削除」を D にすべきか 物理削除なら D、論理削除なら U(is_deleted を立てる)。チームで方針を決める
「権限による分岐」をどう書く? 一般ユーザ用機能と管理者用機能で別の行に書く。「商品登録(管理者)」のように
機能設計書がスカスカ 「同じ画面でエラー表示/別画面に遷移」「成功メッセージの文言」など具体的に書く
異常系の優先順位 全部はできないので「データを壊すもの>ユーザを混乱させるもの>見た目の問題」の順
読み上げを開始します...

AIに質問する