Part 3 Webアプリケーション開発・動画

第10章 データを保存できる形にする

動画台本ナレーション全文

Slide 01. データベースとデータモデリング

第10章では、第9章で整理した支援ステータス機能を、データベースに保存できる形へ置き換えます。ユースケース、用語、状態、ルールを見比べながら、テーブル、カラム、制約、SQLでの確認へ順番につなげます。

Slide 02. この章で持ち帰ること

この章のゴールは、データ設計を自分の言葉で説明できるようにすることです。何を保存するか、どう関係づけるか、どの値を入れてよいかを決めます。制約でおかしなデータが入りにくいようにし、SQLでユースケースを確認します。

Slide 03. 第9章からつなげる

第9章では、メンター、受講者、学習ログ、支援ステータスという言葉とルールを整理しました。第10章では、それをRDB、つまりリレーショナルデータベースの表と関係に置き換えます。ここで作る設計は、第11章でAPIを作るときの土台になります。

Slide 04. DB設計が後から効く

DB設計は、API、画面、テスト、運用に長く影響します。保存する意味が曖昧なままだと、APIの返し方、画面の表示、テストの期待値でも同じ曖昧さが繰り返されます。だから最初に、業務上の意味とルールを、DBに保存できる形にします。

Slide 05. アプリDB設計に絞る

この章では、Webアプリケーションを動かすためのDB設計に集中します。分析用のSQLや大きなデータ基盤の話は広げすぎません。まずは、データを追加する、取り出す、更新する、表をつなぐ、制約を確認する範囲を扱います。

Slide 06. RDBの基本単位

RDBは、データをテーブル、行、カラムとして扱います。テーブルは同じ種類の対象を集める場所です。行は1件のデータ、カラムは名前や作成日時のような項目です。Excelのシートに似て見えますが、関係と制約まで設計する点が大事です。

Slide 07. 主キーと外部キー

主キーは、行を一意に識別するための値です。外部キーは、別のテーブルとの関係を表す値です。受講者IDで受講者を見分け、学習ログにはその受講者IDを持たせます。そうすると、どのログが誰のものかをDB上でたどれます。

Slide 08. 題材を再確認する

題材は、メンターが担当受講者に支援ステータスを付けられる機能です。支援ステータスは、noneは未設定、needs_supportは支援が必要、のように値を決めます。初回リリースでは、自動アラートや分析ダッシュボードは扱いません。

Slide 09. 用語からテーブル候補へ

第9章の用語集から、保存したい対象を選びます。受講者、メンター、学習ログはテーブル候補になりやすい概念です。支援ステータスは、受講者ごとの今の状態だけを持つのか、変更の履歴まで持つのかを考えます。

Slide 10. 関係をテーブルにする

担当関係は、メンターと受講者をつなぐ別テーブルにします。たとえば mentor_assignments というテーブルにすると、誰が誰を担当するかを確認できます。この関係は、担当受講者だけを操作できるかを確認するときにも使えます。

Slide 11. カラム設計を見る

カラム設計では、まず名前、意味、型、必須かどうか、入れてよい値を見ます。余裕があれば、初期値、誰が変えるか、いつ変わるかも確認します。statusという名前を使うときも、何の状態なのかを明確にします。

Slide 12. 状態値を扱う

支援ステータスは、入れてよい候補を先に決めます。最初は文字列で持ち、CHECK制約やコード側の候補で守る形から始めると理解しやすいです。値が増えそうなら、別テーブルに分ける案も検討します。

Slide 13. 制約の役割

制約は、DBに入れてよいデータの条件を決める仕組みです。主キー、外部キー、NOT NULL、UNIQUE、CHECKを使うと、存在しない受講者を参照したり、定義外のステータスを入れたりするミスを減らせます。

Slide 14. 制約の例を見る

たとえば、同じメンターと受講者の担当関係を重複させないなら、mentor_idとlearner_idの組み合わせを一度だけ登録できるようにします。支援ステータスを決めた値だけにしたいなら、CHECK制約で許可する値を示します。

Slide 15. 正規化の基本

正規化は、同じ意味のデータを何度も持たないための考え方です。受講者名を学習ログの各行にコピーして持つと、名前が変わったときに片方だけ古いまま残る危険があります。重複による不整合を減らすために、どのテーブルに何を置くかを整理します。

Slide 16. 現在値と履歴

支援ステータスを今の状態だけで持つと、一覧表示や更新はシンプルです。履歴を持つと、いつ誰が変更したかを追えますが、設計と実装は少し複雑になります。どちらがよいかは、ユースケースと初回リリースの範囲で判断します。

Slide 17. SQLで確認する

SQLは、データベースに対して何を保存し、何を取り出すかを確認する言語です。まずは一覧を取る、追加する、更新する、表をつなぐ、条件で絞る、という操作を試します。設計したテーブルで、実際のユースケースを満たせるか見ます。

Slide 18. 担当受講者一覧を取る

最初の確認は、メンターの担当受講者一覧を取得できるかです。受講者、担当関係、支援ステータスの3つの表をつないで、担当する受講者と今の支援ステータスを一覧にします。SQLを書いてみると、関係の持ち方が自然か見えてきます。

Slide 19. 制約違反も試す

SQL確認では、成功する操作だけでなく、失敗すべき操作も試します。存在しない受講者IDを参照できないか、定義外のステータスを入れられないか、担当関係を重複登録できないかを見ると、制約が効いているか確認できます。

Slide 20. インデックスの入口

インデックスは、検索を助けるための仕組みです。よく使う検索条件や、表をつなぐ条件から候補を考えます。ただし増やせばいつも良いわけではありません。mentor_idで担当受講者を探すなら、その検索を支える候補として検討します。

Slide 21. トランザクションの入口

トランザクションは、複数の更新をひとまとまりに扱うための仕組みです。支援ステータスを更新し、同時に支援履歴を追加する場合、片方だけ成功すると困ります。まとめて成功させるか、まとめて失敗させるために使います。

Slide 22. マイグレーションを意識する

DBスキーマは、プロダクトの変更に合わせて変わります。テーブル追加、カラム追加、制約追加は、既存データにも影響します。たとえばstatusカラムを追加するなら、今ある行に入れる値も考えます。PRでは、変更内容と確認結果を書けるようにします。

Slide 23. AIにスキーマ案を頼む

AIには、テーブル候補、カラム候補、制約候補、確認SQLの初稿を出してもらえます。依頼するときは、第9章の用語、ルール、対象外を渡します。ただし、実データや機密情報は入れません。判断が必要な点も分けて出してもらいます。

Slide 24. 検証責任は人が持つ

AIが出したスキーマ案を採用する前に、既存データに問題が出ないか、命名規則に合うか、使うDBで動くかを確認します。SQLは手元で実行するか、設計材料と照合します。データの意味と移行リスクは、最後に人が判断します。

Slide 25. 個人開発にも使う

個人開発でも、保存するデータと関係は多くの場合出てきます。ユーザー、投稿、コメント、予約、支払いなど、テーマが変わっても考え方は同じです。データモデル、制約チェック、SQL確認ログを軽く残すだけで、後半の実装が進めやすくなります。

Slide 26. 演習1 テーブル候補

演習1では、第9章のドメインモデルからテーブル候補を作ります。保存する対象、関係、状態値、テーブルにしない用語を分けます。最後に、なぜそのテーブルが必要か、どの場面で使うかを自分の言葉で説明します。

Slide 27. 演習2 カラムと制約

演習2では、カラムと制約を設計します。主キー、外部キー、必須、UNIQUE、CHECKを並べ、DBで防ぐことと、アプリケーションコードで確認することを分けます。どこで何を確認するかが、レビューで説明する材料になります。

Slide 28. 演習3から5 SQL確認へ

演習3ではschema-draft.sqlにテーブル案を書きます。演習4ではSQLで一覧取得や制約違反を確認します。演習5では、変更内容、既存データへの影響、確認結果をDB変更メモに残します。この材料を持って、第11章のバックエンドAPIへ進みます。

GitHub で台本を見る

教材を検索