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 |todos.user_id が users.id を参照しています。これを外部キーといいます。
ER図(エンティティ関係図)
テーブルの構造と関係を図で表したものを ER図(Entity Relationship Diagram) といいます。
設計の段階でER図を書くことで、データの整合性を考えながら設計できます。
関係(リレーション)の種類
| 記法 | 意味 |
|---|---|
| ` | |
| ` | |
}o--o{ | 多対多(複数のタグが複数の記事につく) |
やってみよう:ミニブログのスキーマを設計する
ミニブログアプリ(ユーザーが投稿を書き、コメントできる)のスキーマを考えてみましょう。
ステップ1: 必要なデータを洗い出す
まず「このアプリで何を保存する必要があるか」を書き出します。
- ユーザー: 名前、メールアドレス、パスワード
- 投稿: タイトル、本文、誰が書いたか、いつ書いたか
- コメント: 内容、どの投稿へのコメントか、誰が書いたか
ステップ2: テーブルに整理する
ステップ3: 設計の考え方のポイント
主キー(PK)
- 各行を一意に識別するカラム。通常は
idという名前の整数を使う
外部キー(FK)
- 他のテーブルの主キーを参照するカラム
posts.author_idはusers.idを参照する
created_at
- 作成日時はほぼ全テーブルに入れておくと便利
パスワードの保存
- パスワードは平文(そのままの文字列)で保存してはいけない
- 今回は Supabase Auth を使うので、パスワードは Supabase が管理してくれる
usersテーブルにはemailとnameだけ持てば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())
}確認しよう
- テーブル・カラム・外部キーの意味が説明できる
- 自分のアプリに必要なデータを洗い出せた
- ER図(Mermaidでも手書きでも)を書けた
- 1対多の関係を設計できた
AIに聞いてみよう
「多対多のリレーションを設計するとき、中間テーブル(junction table)が必要な理由を教えてください」
次のステップ
Last updated on