🎯 STEP 1: データベース設計とは
良い設計が良いシステムを作る!データベース設計の重要性を学ぼう
📋 このステップで学ぶこと
- データベース設計とは何か、なぜ必要なのか
- 設計が悪いとどんな問題が起こるのか(実例で理解)
- 良い設計と悪い設計の具体的な違い
- 設計を進める5つのステップ
- データモデリングの3層構造(概念・論理・物理)
- 実際のプロジェクトでの設計の進め方
前提知識: SQL基礎(SELECT、INSERT、UPDATE、DELETE が理解できていること)
🎯 1. データベース設計とは何か?
まず「設計」とは何かを理解しよう
何かを作るとき、いきなり作り始める人はいませんよね。家を建てるとき、料理を作るとき、旅行に行くとき… 必ず「計画」を立てます。
データベース設計とは、「システムで使うデータをどのように保存するか、その計画(設計図)を作ること」です。
引っ越しをするとき、荷物を適当にダンボールに詰めると、後で何がどこにあるかわからなくなりますよね。
賢い人は「キッチン用品」「衣類」「書類」などラベルを付けて分類します。
さらに「よく使うもの」と「季節限定のもの」を分けたり、「壊れやすいもの」は別に印をつけたり…
これと同じことを、コンピュータのデータでやるのがデータベース設計です。
データベース設計で具体的に決めること
データベース設計では、以下のようなことを決めます。
| 決めること | 具体例 | なぜ決める必要があるか |
|---|---|---|
| どんなテーブルを作るか | ユーザーテーブル、商品テーブル、注文テーブル | データの種類ごとに整理するため |
| 各テーブルにどんな列(カラム)を持たせるか | 名前、メールアドレス、パスワード | 必要な情報を漏れなく記録するため |
| データ型は何にするか | 文字列(VARCHAR)、数値(INT)、日付(DATE) | 正しいデータだけを保存するため |
| テーブル同士をどう繋ぐか | ユーザーIDで注文テーブルと紐付け | 関連するデータを取り出せるようにするため |
| 主キーと外部キーをどう設定するか | user_id、order_id | データの一意性と整合性を保つため |
| インデックスをどこに貼るか | よく検索するカラムに設定 | 検索を速くするため |
家を建てるとき、いきなり工事を始めることはありませんよね。まず設計図を作ります。
設計図では、「リビングはここ」「キッチンはこの大きさ」「トイレは何個」など、全体の構造を決めます。
データベース設計も同じです。「ユーザー情報はこのテーブル」「注文情報はこのテーブル」「それぞれをどう繋ぐか」を最初に計画します。良い設計図があれば良い家が建つように、良いデータベース設計があれば良いシステムができます!
❌ 2. なぜ設計が重要なのか?悪い設計で起こる問題
「設計なんて面倒だから、とりあえず動くものを作ればいい」と思うかもしれません。
しかし、データベース設計をおろそかにすると、後で取り返しのつかない問題が発生します。
悪い設計が引き起こす5つの問題
例:顧客の住所を注文テーブルに毎回記録していると、同じ顧客が10回注文すると住所も10回記録されます。
- ストレージの無駄遣い
- 住所変更時に10箇所すべて更新が必要
- 更新漏れで古い住所が残るリスク
例:ある場所では「山田太郎」、別の場所では「山田 太郎」(スペース付き)と表記が違う。
- 検索でヒットしない問題
- 集計結果が正しくない
- どちらが正しいかわからない
例:1つの巨大なテーブルに全データを入れると、検索に時間がかかりすぎます。
- ユーザーがページを開くのに何秒もかかる
- 大量アクセス時にシステムダウン
- 後から改善するのが非常に困難
例:「お気に入り機能を追加したい」というとき、設計が悪いと大規模な改修が必要になります。
- 本来1日で終わる作業が1週間かかる
- 既存機能に影響が出てバグが発生
- 開発コストが何倍にも膨らむ
例:データの整合性が取れておらず、「存在しない商品を参照する注文」などが発生。
- アプリケーションがエラーで落ちる
- ユーザーの信頼を失う
- 原因調査に膨大な時間がかかる
具体例:オンラインショップの悪い設計
実際の悪い設計例を見てみましょう。
上記の設計には、以下のような問題があります。
問題①:顧客情報の重複
山田太郎さんの名前とメールアドレスが2回も記録されています。もし山田太郎さんがメールアドレスを変更したら、全ての注文レコードを更新しなければなりません。
問題②:商品情報の重複
「ノートPC」と「80000円」の情報も複数回記録されています。商品名や価格が変わったとき、すべての注文を更新する必要があります。
問題③:価格変更への対応が困難
ノートPCが値下げされたとき、過去の注文の価格も変わってしまうと、売上計算が狂います。「注文時点での価格」と「現在の商品価格」を区別できていません。
良い設計のメリット
しっかりとデータベース設計をすると、以下のようなメリットがあります。
データの重複や矛盾がなく、常に正しい情報が保たれます。更新も1箇所だけで済みます。
適切なインデックスと設計で、検索や更新が高速になります。大量データでも快適に動作します。
変更が必要な場合も、影響範囲が限定的で修正しやすいです。バグ修正も楽になります。
新しい機能を追加する際も、既存の設計を活かせるため、開発が楽になります。
「設計に時間をかけるのはもったいない」と思うかもしれませんが、実は逆です。
最初にしっかり設計すれば、開発中のバグが減り、運用後のトラブルも少なくなります。結果的に、トータルの時間とコストを大幅に削減できます。
ある調査では、設計段階で発見した問題を直すコストは「1」、開発段階では「10」、運用段階では「100」と言われています。
🔄 3. 良い設計 vs 悪い設計の実例
実際のケースで、悪い設計をどう改善するかを比較してみましょう。
実例1:ECサイトの商品と注文
「顧客」「商品」「注文」「注文詳細」を別々のテーブルに分けます。
まず、顧客情報を独立したテーブルにします。
次に、商品情報を独立したテーブルにします。
注文の基本情報を管理するテーブルを作ります。顧客IDで顧客テーブルと紐付けます。
最後に、「どの注文でどの商品を何個買ったか」を記録するテーブルです。ここに「その時点の単価」を記録することがポイントです。
- ✅ 顧客情報は1回だけ記録される(重複なし)
- ✅ 住所変更は顧客テーブルだけ更新すればOK
- ✅ 商品価格も1箇所で管理
- ✅ 注文詳細に「その時の単価」を記録することで、価格変更の影響を受けない
- ✅ データの整合性が保証される
実例2:ブログシステム
- 投稿者情報が記事ごとに重複している
- カテゴリ名も文字列で毎回記録している(「技術」と「テクノロジー」のようなタイポのリスク)
- 投稿者のメール変更時、全記事を更新する必要がある
ユーザー情報を独立したテーブルにします。
カテゴリもマスタテーブルとして管理します。これにより、カテゴリ名の表記揺れを防げます。
記事テーブルは、ユーザーIDとカテゴリIDで他のテーブルを参照します。
- ✅ ユーザー情報はIDで参照(重複なし)
- ✅ カテゴリもマスタテーブルで管理(タイポ防止)
- ✅ データ更新が簡単
- ✅ 外部キー制約で存在しないユーザーやカテゴリを参照できない
良い設計の基本は「同じ情報を複数の場所に保存しない」ことです。
これを「正規化」と言い、Part 2(ステップ7〜12)で詳しく学びます。
🗺️ 4. 設計フローの全体像
データベース設計は、以下の5つのステップで進めていきます。いきなりテーブルを作り始めるのではなく、段階を追って進めることが重要です。
各ステップの詳細
やること:
- システムで管理したいデータをリストアップ
- 必要な機能を洗い出し
- ユーザーやクライアントからのヒアリング
ECサイトの場合の例:
- 「顧客情報を管理したい」(名前、住所、電話番号、メール)
- 「商品情報を管理したい」(商品名、価格、在庫数、画像)
- 「注文履歴を記録したい」(いつ、誰が、何を、いくつ買ったか)
- 「在庫管理をしたい」(入荷、出荷、現在の在庫数)
やること:
- エンティティ(実体)を抽出:「顧客」「商品」「注文」など
- エンティティ同士の関係を整理:「顧客は注文を行う」「注文は商品を含む」
- ER図(Entity-Relationship図)を作成
※ER図については、STEP 3で詳しく学びます
やること:
- 正規化のルールに従ってテーブルを分割
- 主キー、外部キーを決定
- データの整合性を保証する設計
※正規化については、Part 2(STEP 7〜12)で詳しく学びます
やること:
- 具体的なデータ型を決定(VARCHAR(255)、INT、DATETIME など)
- インデックスを設計(どのカラムに貼るか)
- パーティション設計(大量データの場合)
- DBMSに依存する設定(MySQL、PostgreSQL など)
やること:
- CREATE TABLE文でテーブル作成
- テストデータを投入
- 想定通りにクエリが動くか確認
- パフォーマンステスト
- 必要に応じて設計を見直し
設計は一度で完璧にはならないことが多いです。実装しながら問題を発見し、何度も見直すのが普通です。
ただし、最初の設計を丁寧にすることで、後での修正コストを大幅に減らせます。「動けばいい」という姿勢ではなく、「なぜこの設計にするのか」を常に考えましょう。
🏗️ 5. データモデリングの3層構造
データベース設計には、3つのレベル(層)があります。それぞれ異なる視点で設計を進めていきます。
なぜ3層に分けるのでしょうか?それは、一度にすべてを考えようとすると複雑すぎるからです。段階的に詳細を詰めていくことで、設計ミスを防ぎ、関係者との認識合わせもしやすくなります。
| レベル | 説明 | 成果物 |
|---|---|---|
| 概念モデル (Conceptual) |
何を管理するかを整理する段階。技術的な詳細は気にせず、ビジネスの視点で考える。 | エンティティ一覧、ER図(簡易版)、関係の記述 |
| 論理モデル (Logical) |
どう構造化するかを決める段階。正規化を適用し、テーブル設計を行う。 | 正規化されたテーブル設計、主キー・外部キーの定義、詳細なER図 |
| 物理モデル (Physical) |
どう実装するかを決める段階。DBMSに依存する具体的な設定を行う。 | CREATE TABLE文、インデックス定義、ストレージ設計 |
各レベルの詳細と具体例
目的:ビジネス要件を理解し、「何を管理するか」を明確にする
特徴:
- 技術的な詳細は含まない(データ型やインデックスは考えない)
- エンティティと関係性だけを表現
- ビジネスユーザー(非エンジニア)とも共有できる
- 「〇〇は△△を持つ」「〇〇は△△と関連する」という形で記述
概念モデルの具体例(ブログシステム):
目的:データの整合性を保証し、効率的な構造を設計する
特徴:
- 正規化を適用(データの重複を排除)
- 主キー、外部キーを定義
- データ型は抽象的(「文字列」「数値」程度)
- 特定のDBMSに依存しない
論理モデルの具体例(ブログシステム):
目的:実際のDBMSで動作する具体的な設計
特徴:
- 具体的なデータ型を指定(VARCHAR(255)、INT など)
- インデックスを設定(検索を高速化)
- DBMSに依存する機能を使用(AUTO_INCREMENT、ENGINE など)
- 文字コード、ストレージエンジンなども決定
物理モデルの具体例(MySQLでのブログシステム):
※コードが長いため横スクロールできます
段階的に設計を進めることで:
✅ ビジネス要件の理解漏れを防ぐ(まず「何を管理するか」を明確に)
✅ 技術的な詳細に早すぎる段階で囚われない(最初はシンプルに考える)
✅ 各段階でレビューができるので、設計の質が向上
✅ DBMSを変更する場合も、論理モデルまでは使い回せる(MySQL → PostgreSQLなど)
💼 6. 実際のプロジェクトでの設計の進め方
実際のプロジェクトでは、どのように設計を進めていくのでしょうか?ECサイト構築プロジェクトを例に、実践的な流れを見てみましょう。
ステップ1:キックオフミーティング
- クライアントや関係者と打ち合わせ
- 「どんなECサイトを作りたいか」をヒアリング
- 必要な機能をリストアップ(商品検索、カート、決済、会員登録など)
- 想定ユーザー数、商品数、アクセス数の確認
ステップ2:要件整理
- 管理したいデータを洗い出し
- 「顧客」「商品」「注文」「在庫」「配送」「決済」など
- 各データに必要な情報を整理
- 優先度を付ける(必須/あれば良い/将来対応)
ステップ3:概念設計(ER図作成)
- エンティティを抽出(draw.ioなどのツールを使用)
- 関係性を図示
- クライアントと認識合わせ(非エンジニアでも理解できるレベル)
ステップ4:論理設計
- 正規化を適用
- テーブル設計書を作成(Excel、Notionなど)
- 主キー・外部キーを定義
- チーム内でレビュー
ステップ5:物理設計
- データ型を決定
- インデックス設計
- パフォーマンス要件を考慮(将来のデータ量増加も見据えて)
ステップ6:実装とテスト
- テーブル作成(CREATE TABLE文)
- テストデータ投入
- クエリ動作確認
- パフォーマンステスト(大量データでの動作確認)
ステップ7:レビューと改善
- チームでレビュー
- 問題点があれば設計を見直し
- ドキュメント更新
設計時の重要なポイント
設計は一人で進めない。クライアント、開発チーム、運用チームと密に連携することが重要。認識のズレは後から大きな手戻りになります。
設計書、ER図、テーブル定義書など、きちんとドキュメント化する。後から見返せることが大切。「なぜこの設計にしたか」も記録しておく。
最初から完璧を目指さない。実装しながら問題を発見し、改善していく姿勢が大事。ただし、基本設計は慎重に。
将来のデータ量増加を見据えて設計する。「今は100件だから問題ない」ではなく、「将来100万件になったら?」を考える。
- ❌ 要件定義が不十分なまま設計を開始 → 後で大幅な設計変更が必要に
- ❌ 正規化を理解せずに設計 → データの重複や矛盾が発生
- ❌ パフォーマンスを考慮しない → 運用開始後に性能問題が発覚
- ❌ ドキュメントを作らない → 後から理解できない、引き継げない
- ❌ レビューをしない → 設計ミスに気づかず進んでしまう
- ❌ 「動けばいい」で終わる → 保守性が低く、改修が困難に
🎯 7. このコースで学ぶこと
このコース全20ステップで、データベース設計の基礎から実践までを網羅的に学びます。
Part 1: 基礎理論(ステップ1〜6)
- データベース設計の基本概念(今学んでいる内容)
- エンティティとリレーションシップ
- ER図の書き方
- データ型の選択
- 主キーと外部キー
- 命名規則とベストプラクティス
Part 2: 正規化(ステップ7〜12)
- 正規化とは何か、なぜ必要か
- 第1正規形、第2正規形、第3正規形
- BCNF(ボイスコッド正規形)
- 正規化の総合演習
Part 3: 実践設計(ステップ13〜17)
- インデックス設計戦略
- データウェアハウス設計(OLAP)
- スタースキーマとスノーフレークスキーマ
- NoSQL基礎(MongoDB)
Part 4: 総合プロジェクト(ステップ18〜20)
- SNS設計プロジェクト(Twitter風サービス)
- ECサイト設計プロジェクト
- 予約システム設計プロジェクト(ホテル・レストラン)
- ✅ 順番通りに学ぶ:各ステップは前のステップの知識を前提としています
- ✅ 手を動かす:読むだけでなく、実際にER図を書いたり、SQLを書いたりしましょう
- ✅ 練習問題を解く:各ステップの練習問題で理解度を確認
- ✅ プロジェクトに挑戦:Part 4の総合プロジェクトで実践力をつける
- ✅ 「なぜ」を考える:なぜこの設計なのか、別の方法はないか、を常に考える
📝 STEP 1 のまとめ
- データベース設計とは、データをどう保存するかの設計図を作ること
- 良い設計はデータの整合性、パフォーマンス、保守性を保証する
- 悪い設計は重複、矛盾、パフォーマンス低下を引き起こす
- 設計は5つのステップで進める:要件定義 → 概念設計 → 論理設計 → 物理設計 → 実装
- データモデリングには3つのレベルがある:概念、論理、物理
- 実際のプロジェクトでは、関係者との連携と反復的な改善が重要
データベース設計は、システム開発の土台です。家を建てるときの設計図と同じように、しっかりとした設計があれば、良いシステムが作れます。
次のSTEP 2では、エンティティとリレーションシップについて学び、「データをどう整理するか」の基本概念を深めていきましょう。
📝 理解度チェック
データベース設計とは何か、自分の言葉で説明してください。
データベース設計とは、システムで使うデータをどのように保存するか、その設計図を作ることです。
具体的には、以下のようなことを決めます。
- どんなテーブルを作るか(顧客、商品、注文など)
- 各テーブルにどんなカラムを持たせるか(名前、価格、日付など)
- テーブル同士をどう繋ぐか(顧客IDで紐付けるなど)
ポイント:「設計図」「テーブル」「カラム」「関係性」などのキーワードが入っていればOKです。
悪いデータベース設計によって引き起こされる問題を3つ挙げてください。
以下の5つから3つを選んで答えられればOKです。
- データの重複:同じ情報が複数の場所に保存され、更新が大変になる
- データの矛盾:ある場所では「山田太郎」、別の場所では「山田 太郎」と表記が違うなど、整合性が取れなくなる
- パフォーマンス低下:検索に時間がかかりすぎて、システムが遅くなる
- 拡張性がない:新機能を追加しようとすると、大規模な改修が必要になる
- バグが多発:データの整合性が取れず、エラーが頻発する
データベース設計の5つのステップを順番に挙げてください。
- 要件定義:「何を作りたいのか」を明確にする
- 概念設計(ER図作成):「どんなエンティティがあるか」を整理
- 論理設計(正規化):データの重複や矛盾を排除するため、正規化を適用
- 物理設計:実際のDBMSに合わせて、データ型やインデックスを決定
- 実装・テスト:テーブルを作成し、動作確認
データモデリングの3層構造(概念モデル、論理モデル、物理モデル)について、それぞれの役割を説明してください。
1. 概念モデル(Conceptual Model)
- 役割:「何を管理するか」を整理する段階
- ビジネスの視点で考え、技術的な詳細は気にしない
- エンティティと関係性を抽出する
- 成果物:エンティティ一覧、簡易ER図
2. 論理モデル(Logical Model)
- 役割:「どう構造化するか」を決める段階
- 正規化を適用し、テーブル設計を行う
- 主キー・外部キーを定義する
- 成果物:正規化されたテーブル設計、詳細ER図
3. 物理モデル(Physical Model)
- 役割:「どう実装するか」を決める段階
- 実際のDBMSに合わせて設計
- 具体的なデータ型、インデックス、ストレージなどを決定
- 成果物:CREATE TABLE文、インデックス定義
以下の「悪い設計」の例を見て、どこが問題かを指摘し、どう改善すべきか考えてください。
- 学生情報の重複:山田太郎の情報が2回記録されている。名前変更時に複数レコードを更新する必要がある。
- 教師情報の重複:佐藤先生の情報が2回記録されている。
- 科目と教師の関係が不明確:「数学」と「佐藤先生」の関係がテーブル構造から読み取れない。
テーブルを4つに分割する。
改善のポイント:
✅ 学生情報の重複を解消
✅ 教師情報の重複を解消
✅ 科目と教師の関係を明確化
✅ データの更新が簡単になる
✅ 外部キー制約でデータの整合性を保証できる
❓ よくある質問
・データベースエンジニア:設計が本業
・バックエンドエンジニア:APIとDBの設計を担当
・データアナリスト:データ構造を理解して効率的に分析
・プロジェクトマネージャー:技術的な判断ができる
・システムアーキテクト:全体設計の中でDB設計を統括
学習メモ
データベース設計・データモデリング - Step 1