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