CRUD図と機能設計の考え方
概要
- 日程: Day 8 / セッション 1
- 時間: 09:30-09:55(25分)
- 形式: 座学
- ゴール: CRUD図の役割(機能とテーブルの対応を見える化し設計漏れを発見する)と機能設計書に書くべき項目(入力チェック・ボタン動作・初期設定)を挙げられ、CRUD図で設計漏れを発見する手順を実例で説明できる
- 学習形式: 対話型解説、ケーススタディ
導入(5分)
昨日(Day 7)はテーブル定義書とER図を作りました。データの入れ物と、入れ物どうしの関係が見えてきました。
ここで質問です。作ったテーブルは、すべての機能から正しく使われているでしょうか?
- 「会員テーブルはあるけど、会員登録機能を作り忘れていないか?」
- 「お気に入りテーブルがあるのに、誰も登録できないのでは?」
- 「予約テーブルに Delete機能が無い。本当に削除不要?」
これに答える道具が CRUD図 です。今日のセッションでは、CRUD図と機能設計書の役割を学びます。
内部設計の現在地
本編(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 |
問いかけ:気になる点は?
→ 解答例
products列に C/U/D が無い → 商品マスタ管理機能が漏れているfavorites列に C/D が無い → お気に入りを追加・削除する機能が無い(表示だけ)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 を行うか
- 成功時の遷移先・表示
- 失敗時のメッセージ・遷移先
例:会員登録ボタン
- 入力チェック(上記)。エラーがあれば同画面で表示
- メールアドレスの重複チェック(
membersテーブルを SELECT)。重複ありなら「既に登録済みです」 - パスワードをハッシュ化
membersテーブルに INSERT- 成功時:ログイン画面へ遷移、「登録完了」メッセージ
- 失敗時:同画面で「登録に失敗しました。時間をおいて再試行してください」
(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つに絞ります。
- CRUD図は 機能とテーブルの対応マトリクス。空白から設計漏れを発見する道具
- 機能設計書には 入力チェック・ボタン動作・初期設定を必ず書く
- 異常系(空入力・桁オーバー・競合) を必ず設計する
次のセッション(Session 2)では、自チームのCRUD図を実際に作り、設計漏れを1件以上見つけて修正します。
🔄 振り返りチェック
- CRUD図の役割を1文で説明できる
- CRUDのそれぞれの意味とSQLを対応づけられる
- 設計漏れの典型パターンを3つ挙げられる
- 機能設計書の3要素を挙げられる
- 異常系の例を3つ挙げられる
補足資料
- 前日資料:
Day7_Session01_内部設計とDBMS_正規化の考え方.md〜Day7_Session03_ER図の作成.md - Day5 機能一覧(自チーム成果物)
- Day7 テーブル定義書(自チーム成果物)
学習ガイド
想定される質問と回答例
| 質問 | ヒント |
|---|---|
| CRUD図を毎回作るのは大変では? | 機能・テーブル数が10程度なら15分で書ける。設計漏れ発見の費用対効果が高い |
| 1機能で複数テーブルに同じ操作(CCC)がある場合は? | そのまま全部書く。トランザクションが必要なヒントになる |
| 機能設計書はどこまで詳細に書く? | 「実装者が見て迷わない」を目安に。コードに近すぎるとメンテが大変、抽象的すぎると実装で困る |
| 異常系をすべて設計するのは無理では? | 「空入力・桁オーバー・形式違反・競合・権限なし」の5観点をチェックリスト化すれば抜けにくい |
| ボタンの動作は画面仕様書と重複しない? | 画面仕様書は「見た目」、機能設計書は「中身」。視点が違うので両方必要 |
つまずきやすいポイント
| つまずきポイント | ヒント |
|---|---|
| CRUDの C と U を区別できていない | C は新規行を作る、U は既存行を更新する。upsert(あれば更新・なければ作成)は CU と書く流派もある |
| 「論理削除」を D にすべきか | 物理削除なら D、論理削除なら U(is_deleted を立てる)。チームで方針を決める |
| 「権限による分岐」をどう書く? | 一般ユーザ用機能と管理者用機能で別の行に書く。「商品登録(管理者)」のように |
| 機能設計書がスカスカ | 「同じ画面でエラー表示/別画面に遷移」「成功メッセージの文言」など具体的に書く |
| 異常系の優先順位 | 全部はできないので「データを壊すもの>ユーザを混乱させるもの>見た目の問題」の順 |