Construindo uma Ferramenta de Gerenciamento de Projetos com Prisma
Estou construindo uma ferramenta de gerenciamento de projetos colaborativa como o Trello.
Estou usando React, Express.js, PostgreSQL e Socket.io. Antes de escrever qualquer rota de backend, preciso projetar o esquema do banco de dados.
O esquema é a base. Se o esquema estiver errado, todo o aplicativo falha. Aqui está o meu detalhamento do design do esquema do Prisma.
Os Modelos
• User: Armazena nomes, e-mails e senhas. Uso cuid() para os IDs. Isso cria strings longas e únicas. É melhor do que números porque não revela a contagem de usuários na URL.
• Project: Contém o nome e a descrição do projeto. Tornei a descrição opcional usando um ponto de interrogação.
• ProjectMember: Esta é uma tabela de junção. Ela vincula Users a Projects. Como um usuário pode participar de muitos projetos e um projeto tem muitos usuários, você precisa desta tabela intermediária para gerenciar o relacionamento many-to-many. Adicionei uma restrição de unicidade para evitar que o mesmo usuário entre em um projeto duas vezes.
• Board: As tarefas ficam dentro de boards. Os boards ficam dentro de projects. Essa hierarquia facilita o drag-and-drop. Mover uma tarefa entre colunas é apenas uma atualização de campo único.
• Task: Este é o modelo principal. Ele possui dois relacionamentos diferentes com o modelo User:
- Um usuário atribuído (isso é opcional).
- Um criador (isso é obrigatório). Tive que nomear esses relacionamentos explicitamente para que o Prisma saiba qual é qual.
• Comment: Os usuários podem deixar comentários nas tarefas. Nomeei o relacionamento como "author" em vez de "user" para manter o código legível.
• Notification: Um modelo simples para rastrear mensagens para os usuários.
Lições Técnicas Aprendidas
Encontrei vários erros ao construir isso. Fique atento a estes:
- Nomes de Relacionamento: Se dois campos apontarem para o mesmo modelo, você deve nomear os relacionamentos. Se não o fizer, o Prisma lançará um erro.
- Campos Anuláveis: Se um relacionamento for opcional, você deve colocar um ponto de interrogação tanto no campo de relacionamento quanto no campo da chave estrangeira.
- Erros de Sintaxe: O Prisma exige aspas duplas para valores padrão de string. Aspas simples causarão erro.
- Sintaxe de Relacionamento: Sempre use a sintaxe correta:
@relation(fields: [localField], references: [remoteField]).
O esquema agora foi migrado. Em seguida, vou construir o backend em Express e a configuração do Socket.io para atualizações em tempo real.