Entwicklung eines Projektmanagement-Tools mit Prisma
Ich entwickle ein kollaboratives Projektmanagement-Tool wie Trello. Ich verwende React, Express.js, PostgreSQL und Socket.io.
Der erste Schritt ist das Datenbank-Schema. Ich habe sechs Modelle entworfen, um Benutzer, Projekte, Boards, Aufgaben, Kommentare und Benachrichtigungen zu verwalten.
Hier sind die wichtigsten technischen Entscheidungen und Erkenntnisse aus meinem Prisma-Schema-Design:
• Verwendung von CUID für IDs
Ich verwende @default(cuid()) für alle IDs. Diese sind für öffentliche URLs besser geeignet als einfache Zahlen. Sie verhindern, dass man erraten kann, wie viele Datensätze vorhanden sind.
• Explizite Beziehungsnamen
Wenn zwei Felder auf dasselbe Modell verweisen, wird Prisma verwirrt. Zum Beispiel hat eine Aufgabe einen Ersteller (Creator) und einen zugewiesenen Benutzer (Assignee). Beide sind Users. Ich muss diese Beziehungen explizit mithilfe von @relation-Namen benennen, um Migrationsfehler zu vermeiden.
• Zwischentabellen für Many-to-Many-Beziehungen
Ein Benutzer kann vielen Projekten angehören. Ein Projekt kann viele Benutzer haben. Ich habe ein ProjectMember-Modell erstellt, um sie zu verknüpfen. Ich habe einen Unique-Constraint auf userId und projectId gesetzt. Dies verhindert, dass derselbe Benutzer einem Projekt zweimal beitritt.
• Hierarchie und Logik
Aufgaben existieren nicht direkt in Projekten. Sie existieren in Boards. Boards existieren in Projekten. Das macht Drag-and-Drop einfach. Um eine Aufgabe zu verschieben, muss nur die boardId aktualisiert werden.
• Nullable-Beziehungen
Einige Beziehungen sind erforderlich, andere sind optional. Eine Aufgabe muss einen Ersteller haben, daher verwende ich kein Fragezeichen. Ein zugewiesener Benutzer ist optional, daher verwende ich User? und String?. Man muss beides angeben, damit das Schema funktioniert.
Häufige Fehler, die ich gefunden habe:
- Verwendung von einfachen Anführungszeichen für Defaults. Prisma erfordert doppelte Anführungszeichen.
- Vergessen des Doppelpunkts in der Referenz-Syntax.
- Versehentliches Anwenden von
@default(now())auf ein ID-Feld.
Als Nächstes werde ich das Express-Backend bauen und Socket.io für Echtzeit-Updates einrichten.