Skip to Content

DBスキーマを設計しよう

このページで学ぶこと

  • リレーショナルデータベースの基本がわかる
  • ER図(エンティティ関係図)を書ける
  • アプリのデータ構造をテーブルとして表現できる

データベースとは

データベース(DB) はデータを永続的に保存する仕組みです。
アプリを再起動してもデータが消えないのはDBがあるからです。

リレーショナルデータベース

Supabase(PostgreSQL)はリレーショナルデータベースです。
データはExcelのような「テーブル(表)」の形で保存されます。

usersテーブル:
| id | name   | email             |
|----|--------|-------------------|
| 1  | 田中太郎 | tanaka@example.com |
| 2  | 鈴木花子 | suzuki@example.com |

todosテーブル:
| id | title    | completed | user_id |
|----|----------|-----------|---------|
| 1  | 牛乳を買う | false     | 1       |
| 2  | 洗濯する  | true      | 1       |
| 3  | 読書する  | false     | 2       |
plaintext

todos.user_idusers.id を参照しています。これを外部キーといいます。


ER図(エンティティ関係図)

テーブルの構造と関係を図で表したものを ER図(Entity Relationship Diagram) といいます。
設計の段階でER図を書くことで、データの整合性を考えながら設計できます。

関係(リレーション)の種類

記法意味
`
`
}o--o{多対多(複数のタグが複数の記事につく)

やってみよう:ミニブログのスキーマを設計する

ミニブログアプリ(ユーザーが投稿を書き、コメントできる)のスキーマを考えてみましょう。

ステップ1: 必要なデータを洗い出す

まず「このアプリで何を保存する必要があるか」を書き出します。

  • ユーザー: 名前、メールアドレス、パスワード
  • 投稿: タイトル、本文、誰が書いたか、いつ書いたか
  • コメント: 内容、どの投稿へのコメントか、誰が書いたか

ステップ2: テーブルに整理する

ステップ3: 設計の考え方のポイント

主キー(PK)

  • 各行を一意に識別するカラム。通常は id という名前の整数を使う

外部キー(FK)

  • 他のテーブルの主キーを参照するカラム
  • posts.author_idusers.id を参照する

created_at

  • 作成日時はほぼ全テーブルに入れておくと便利

パスワードの保存

  • パスワードは平文(そのままの文字列)で保存してはいけない
  • 今回は Supabase Auth を使うので、パスワードは Supabase が管理してくれる
  • users テーブルには emailname だけ持てばOK

Prisma スキーマへの変換

ER図を書いたら、次は Prisma スキーマに落とし込みます。
(Prismaの詳細は次のページで学びます)

// prisma/schema.prisma のイメージ
 
model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  posts     Post[]   // 1対多の関係
  comments  Comment[]
  createdAt DateTime @default(now())
}
 
model Post {
  id        Int       @id @default(autoincrement())
  title     String
  content   String
  author    User      @relation(fields: [authorId], references: [id])
  authorId  Int
  comments  Comment[]
  createdAt DateTime  @default(now())
}
 
model Comment {
  id        Int      @id @default(autoincrement())
  content   String
  post      Post     @relation(fields: [postId], references: [id])
  postId    Int
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
  createdAt DateTime @default(now())
}
prisma

確認しよう

  • テーブル・カラム・外部キーの意味が説明できる
  • 自分のアプリに必要なデータを洗い出せた
  • ER図(Mermaidでも手書きでも)を書けた
  • 1対多の関係を設計できた

AIに聞いてみよう

「多対多のリレーションを設計するとき、中間テーブル(junction table)が必要な理由を教えてください」


次のステップ

Supabaseをセットアップする

Last updated on