Prismaを使用したプロジェクト管理ツールの構築
Trelloのようなコラボレーション型プロジェクト管理ツールを構築しています。React、Express.js、PostgreSQL、およびSocket.ioを使用しています。
最初の手順はデータベーススキーマの設計です。ユーザー、プロジェクト、ボード、タスク、コメント、通知を扱うために6つのモデルを設計しました。
以下に、Prismaスキーマ設計における主要な技術的選択と学んだ教訓をまとめます。
• IDにCUIDを使用する
すべてのIDに @default(cuid()) を使用しています。公開URLにおいては、単純な数値よりもCUIDの方が適しています。レコードの総数を推測されるのを防ぐことができるからです。
• 明示的なリレーション名
2つのフィールドが同じモデルを指している場合、Prismaが混乱することがあります。例えば、タスクには作成者(creator)と担当者(assignee)がいますが、どちらも Users モデルです。マイグレーションエラーを防ぐために、@relation 名を使用してこれらのリレーションを明示的に命名する必要があります。
• 多対多のリレーションのための中間テーブル
ユーザーは多くのプロジェクトに所属できますし、プロジェクトには多くのユーザーが所属できます。これらを紐付けるために ProjectMember モデルを作成しました。userId と projectId に一意制約(unique constraint)を追加することで、同じユーザーが同じプロジェクトに二重に登録されるのを防いでいます。
• 階層構造とロジック
タスクはプロジェクトに直接属するのではなく、ボードに属します。ボードはプロジェクトに属します。これにより、ドラッグ&ドロップが簡単になります。タスクを移動するには、その boardId を更新するだけで済みます。
• Null許容のリレーション
リレーションには必須のものと、オプション(任意)のものがあります。タスクには必ず作成者が必要なので、クエスチョンマークは使いません。一方で、担当者は任意なので、User? や String? を使用します。スキーマを正しく機能させるには、これらを適切に含める必要があります。
見つけたよくある間違い:
- デフォルト値にシングルクォートを使用する。Prismaではダブルクォートが必要です。
- 参照(references)構文のコロンを忘れる。
- 誤ってIDフィールドに
@default(now())を適用してしまう。
次のステップでは、Expressバックエンドを構築し、リアルタイム更新のためにSocket.ioをセットアップします。