Prisma を使用したプロジェクト管理ツールの構築
Trelloのような、コラボレーション型のプロジェクト管理ツールを構築しています。
React、Express.js、PostgreSQL、そしてSocket.ioを使用しています。バックエンドのルートを書き始める前に、データベーススキーマを設計する必要があります。
スキーマは基盤です。スキーマが間違っていれば、アプリ全体が失敗します。以下に、Prismaスキーマ設計の内訳をまとめました。
モデル
• User: 名前、メールアドレス、パスワードを保存します。IDには cuid() を使用しています。これにより、長く一意な文字列が生成されます。URLからユーザー数が漏洩することがないため、数値よりも優れています。
• Project: プロジェクト名と説明を保持します。説明は、クエスチョンマークを使用してオプション(任意)にしました。
• ProjectMember: これは中間テーブルです。UserとProjectを紐付けます。一人のユーザーが多くのプロジェクトに参加でき、一つのプロジェクトに多くのユーザーがいるため、多対多のリレーションシップを管理するためにこの中間テーブルが必要です。同じユーザーが同じプロジェクトに二度参加できないよう、一意制約(unique constraint)を追加しました。
• Board: タスクはボード内に存在し、ボードはプロジェクト内に存在します。この階層構造により、ドラッグ&ドロップが容易になります。カラム間でタスクを移動させるのは、単一のフィールド更新だけで済みます。
• Task: これがコアとなるモデルです。Userモデルに対して2つの異なるリレーションを持っています:
- 担当ユーザー(これはオプションです)。
- 作成者(これは必須です)。 Prismaがどちらがどちらであるかを識別できるように、これらのリレーションに明示的な名前を付ける必要がありました。
• Comment: ユーザーはタスクにコメントを残すことができます。コードの可読性を保つために、リレーション名を "user" ではなく "author" としました。
• Notification: ユーザーへのメッセージを追跡するためのシンプルなモデルです。
学んだ技術的な教訓
これを構築している間に、いくつかのエラーに直面しました。以下の点に注意してください:
- リレーション名: 2つのフィールドが同じモデルを指している場合、リレーションに名前を付ける必要があります。そうしないと、Prismaがエラーをスローします。
- Nullable(Null許容)フィールド: リレーションがオプションである場合、リレーションフィールドと外部キーフィールドの両方にクエスチョンマークを付ける必要があります。
- 構文エラー: Prismaでは、文字列のデフォルト値にダブルクォーテーションが必要です。シングルクォーテーションを使用すると失敗します。
- リレーションの構文: 常に正しい構文を使用してください:
@relation(fields: [localField], references: [remoteField])。
スキーマのマイグレーションは完了しました。次は、リアルタイム更新のためのExpressバックエンドとSocket.ioのセットアップを構築します。