Створення інструменту управління проєктами за допомогою Prisma
Я створюю інструмент для спільної роботи над проєктами, подібний до Trello.
Я використовую React, Express.js, PostgreSQL та Socket.io. Перш ніж писати будь-які маршрути (routes) бекенду, я маю спроектувати схему бази даних.
Схема — це фундамент. Якщо схема побудована неправильно, весь додаток не працюватиме. Ось мій розбір проєктування схеми Prisma.
Моделі
• User: зберігає імена, електронні адреси та паролі. Для ID я використовую cuid(). Це створює довгі унікальні рядки. Це краще за числа, оскільки це не розкриває кількість користувачів через URL.
• Project: містить назву та опис проєкту. Я зробив опис необов'язковим за допомогою знака питання.
• ProjectMember: це проміжна таблиця. Вона пов'язує користувачів (Users) із проєктами (Projects). Оскільки один користувач може брати участь у багатьох проєктах, а один проєкт може мати багато користувачів, вам потрібна ця проміжна таблиця для керування зв'язком «багато до багатьох». Я додав унікальне обмеження (unique constraint), щоб запобігти повторному приєднанню того самого користувача до одного проєкту.
• Board: завдання знаходяться всередині дощок (boards). Дошки — всередині проєктів. Така ієрархія полегшує функцію drag-and-drop. Переміщення завдання між колонками — це лише оновлення одного поля.
• Task: це основна модель. Вона має два різні зв'язки з моделлю User:
- призначений користувач (це необов'язково).
- творець (це обов'язково). Мені довелося явно назвати ці зв'язки, щоб Prisma могла розрізняти їх.
• Comment: користувачі можуть залишати коментарі до завдань. Я назвав зв'язок «author» замість «user», щоб зберегти читабельність коду.
• Notification: проста модель для відстеження повідомлень користувачів.
Технічні висновки
Під час розробки я зіткнувся з кількома помилками. Зверніть на них увагу:
- Назви зв'язків (Relation Names): Якщо два поля вказують на одну й ту саму модель, ви повинні назвати ці зв'язки. Якщо ви цього не зробите, Prisma видасть помилку.
- Поля, що можуть бути порожніми (Nullable Fields): Якщо зв'язок є необов'язковим, ви повинні поставити знак питання як у полі зв'язку, так і у полі зовнішнього ключа (foreign key).
- Синтаксичні помилки: Prisma вимагає подвійних лапок для значень за замовчуванням типу string. Одинарні лапки призведуть до помилки.
- Синтаксис зв'язків: Завжди використовуйте правильний синтаксис:
@relation(fields: [localField], references: [remoteField]).
Схему вже мігровано. Далі я створю бекенд на Express та налаштую Socket.io для оновлень у реальному часі.