Создание инструмента для управления проектами с помощью 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?. Чтобы схема работала, необходимо указывать оба поля.

Ошибки, которые я обнаружил:

Далее я создам бэкенд на Express и настрою Socket.io для обновлений в реальном времени.

Источник: https://dev.to/chinwuba_jeffrey/building-a-project-management-tool-from-scratch-starting-with-the-prisma-schema-161