Relacionamentos no Schema do Prisma: One-to-One, One-to-Many, Many-to-Many e Self-Relations

Posted by

O Prisma ORM é uma ferramenta poderosa que simplifica o acesso e a modelagem de dados em aplicações modernas. Um dos seus principais recursos é a capacidade de definir relacionamentos entre modelos no schema, permitindo representar com precisão as ligações entre os dados da sua aplicação.

Com exemplos práticos e explicações objetivas, você entenderá como estruturar esses relacionamentos e aplicá-los de forma eficiente na sua base de código.

Relacionamento One-to-One (Um para Um)

Um relacionamento One-to-One define que um registro em uma tabela está associado exclusivamente a um único registro em outra tabela.

Esse tipo de relação é útil quando há uma associação única entre dois modelos, como entre usuário e perfil ou cliente e documento de identificação.

Exemplo no schema do Prisma:

model User {
  id        Int      @id @default(autoincrement())
  profile   Profile?
}

model Profile {
  id       Int    @id @default(autoincrement())
  user     User   @relation(fields: [userId], references: [id])
  userId   Int    @unique
}

No exemplo acima, cada Profile está associado a um único User, e vice-versa. O uso de @unique garante que não haja mais de um perfil vinculado ao mesmo usuário.

Relacionamento One-to-Many (Um para Muitos)

O relacionamento One-to-Many é o mais comum em sistemas de banco de dados. Ele permite que um registro esteja associado a vários outros registros em outra tabela.

Exemplos típicos incluem usuários e posts, categorias e produtos, ou clientes e pedidos.

Exemplo no schema do Prisma:

model User {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

model Post {
  id         Int    @id @default(autoincrement())
  author     User   @relation(fields: [authorId], references: [id])
  authorId   Int
}

Aqui, um User pode ter vários registros em Post, mas cada Post pertence a apenas um User. A chave estrangeira (authorId) está localizada no modelo Post.

Relacionamento Many-to-Many (Muitos para Muitos)

Um relacionamento Many-to-Many ocorre quando múltiplos registros em uma tabela estão associados a múltiplos registros em outra tabela.

Casos de uso comuns incluem usuários e grupos, produtos e categorias, ou autores e livros.

No Prisma, esse tipo de relação é implementado usando uma tabela intermediária (join table), que é gerenciada automaticamente pelo Prisma Client.

Exemplo no schema do Prisma:

model User {
  id       Int      @id @default(autoincrement())
  projects Project[]
}

model Project {
  id      Int      @id @default(autoincrement())
  users   User[]
}

Internamente, o Prisma cria uma tabela chamada _ProjectToUser para armazenar as relações entre projetos e usuários, facilitando consultas e manipulações.

Self-Relations (Relações Auto-Referenciais)

Uma Self-Relation acontece quando um modelo possui uma relação com ele mesmo. Esse tipo de estrutura é útil para representar hierarquias, árvores genealógicas ou comentários aninhados.

Exemplo no schema do Prisma:

model Category {
  id            Int         @id @default(autoincrement())
  name          String
  parent        Category?   @relation("CategoryParent")
  parentId      Int?
  subcategories Category[]  @relation("CategoryParent", fields: [parentId], references: [id])
}

Nesse caso, uma categoria pode ter uma categoria pai (parent) e várias filhas (subcategories). O nome "CategoryParent" ajuda a identificar a relação e conectar corretamente os campos.

Conclusão

Os relacionamentos são fundamentais para estruturar corretamente os dados em qualquer sistema. Com o Prisma Schema, você tem à disposição uma sintaxe clara e intuitiva para definir relações complexas com simplicidade.

Seja qual for o tipo de aplicação que você está desenvolvendo, saber utilizar os relacionamentos no Prisma — sejam eles One-to-One, One-to-Many, Many-to-Many ou Self-Relations — vai ajudar a construir um sistema mais organizado, escalável e performático.

One comment

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *