Создание инструмента для управления проектами с помощью Prisma
Я создаю инструмент для совместного управления проектами, похожий на Trello. Я использую React, Express.js, PostgreSQL и Socket.io.
Первый шаг — это схема базы данных. Я разработал шесть моделей для работы с пользователями, проектами, досками, задачами, комментариями и уведомлениями.
Вот основные технические решения и уроки, которые я извлек из проектирования схемы Prisma:
• Использование CUID для ID
Я использую @default(cuid()) для всех ID. Для публичных URL они лучше, чем простые числа. Это не позволяет пользователям угадать, сколько записей у вас есть.
• Явные имена связей
Когда два поля указывают на одну и ту же модель, Prisma может запутаться. Например, у задачи есть создатель (creator) и исполнитель (assignee). Оба являются пользователями (Users). Я должен явно называть эти связи, используя имена в @relation, чтобы избежать ошибок миграции.
• Промежуточные таблицы для связей «многие ко многим»
Пользователь может принадлежать ко многим проектам. Проект может содержать много пользователей. Я создал модель ProjectMember, чтобы связать их. Я добавил ограничение уникальности (unique constraint) на userId и projectId. Это предотвращает повторное присоединение одного и того же пользователя к одному проекту.
• Иерархия и логика
Задачи не находятся в проектах. Они находятся на досках. Доски находятся в проектах. Это упрощает реализацию drag-and-drop. Чтобы переместить задачу, нужно просто обновить её boardId.
• Связи, допускающие null
Некоторые связи являются обязательными, а некоторые — необязательными. У задачи обязательно должен быть создатель, поэтому я не использую вопросительный знак. Исполнитель (assignee) необязателен, поэтому я использую User? и String?. Чтобы схема работала, необходимо указывать оба поля.
Ошибки, которые я обнаружил:
- Использование одинарных кавычек для значений по умолчанию. Prisma требует двойные кавычки.
- Забывание двоеточия в синтаксисе ссылок (references).
- Случайное применение
@default(now())к полю ID.
Далее я создам бэкенд на Express и настрою Socket.io для обновлений в реальном времени.