Как сконфигурировать десятки связей и не потеряться в модели (prisma orm)?

Ссылка скопирована
1 ответ

Модель:

model UserAccount { id Int @id @unique @default(autoincrement()) @map("id") roles Role[] @default([USER]) @map("roles") invitedBy Int? @map("invited_by") invitationLinks String[] @map("invitation_links") actions UserAction[] bookings Booking[] notifications Notification[] createdProducts Product[] @relation("user_created_products") isBlocked Boolean @map("is_blocked") blockedBy Int @map("blocked_by") blockedAt DateTime @map("blocked_at") @db.Timestamptz() blockingReason String @map("blocking_reason") @db.VarChar(128) isDeleted Boolean @default(false) @map("is_deleted") deletedBy Int @map("deleted_by") deletedAt DateTime? @map("deleted_at") @db.Timestamptz() deletionReason String? @map("deletion_reason") @db.VarChar(128) createdBy Int? @map("created_by") createdAt DateTime @map("created_at") @db.Timestamptz() updatedBy Int? @map("updated_by") updatedAt DateTime? @map("updated_at") @db.Timestamptz() tablesAuditLogs TableAuditLog[] @@map("user_accounts") }

Сейчас ситуация такая: мне хотелось бы иметь возможность в одном запросе получить профиль пользователя, который создал запись, НО:
По вводным: 1. Если кол-во связей увеличивается, у меня начинает кипеть голова.
Сейчас ситуация такая: 2. Я не понимаю как группировать поля, например: есть связи технические, а есть основные - например bookings и если бы я решил отделить все связи от основных полей, не разделяя их, стало бы чуть полегче, но потеряется логика.

Сейчас ситуация такая: планирую поделить схемы на интуитивно понятные блоки, чтобы не тратить время на поиски и последующие воспоминания (спустя время).

Сейчас ситуация такая: визуальная библиотека подобных схем на нуле, поэтому выбирать или хотя-бы вдохновиться не чем.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Кирилл JS Ответ

В Prisma при десятках связей главная задача — не “запихнуть всё в одну модель”, а сделать схему читаемой: явные имена relation, понятные блоки, отдельные join-модели для сложных связей и минимальное количество массивов там, где они не нужны. Если модель UserAccount начинает содержать все связи проекта, она быстро превращается в нечитаемый центр вселенной.

Первое правило: каждой неоднозначной связи давайте имя через @relation. Особенно если две модели связаны между собой больше одного раза:

model UserAccount {
  id Int @id @default(autoincrement())
 
  invitedById Int?
  invitedBy   UserAccount?  @relation("UserInvites", fields: [invitedById], references: [id])
  invitedUsers UserAccount[] @relation("UserInvites")
}

model UserAccount { id Int @id @default(autoincrement()) invitedById Int? invitedBy UserAccount? @relation("UserInvites", fields: [invitedById], references: [id]) invitedUsers UserAccount[] @relation("UserInvites") }

Второе: для связей many-to-many с дополнительными полями делайте явную промежуточную модель. Не используйте неявный массив, если у связи есть статус, дата, роль, порядок или metadata.

model UserProject {
  userId Int
  projectId Int
  role String
  createdAt DateTime @default(now())
 
  user UserAccount @relation(fields: [userId], references: [id])
  project Project @relation(fields: [projectId], references: [id])
 
  @@id([userId, projectId])
}

model UserProject { userId Int projectId Int role String createdAt DateTime @default(now()) user UserAccount @relation(fields: [userId], references: [id]) project Project @relation(fields: [projectId], references: [id]) @@id([userId, projectId]) }

Третье: не храните ID массивами вроде String[], если по ним потом нужно искать, фильтровать и строить связи. Для PostgreSQL массивы удобны, но для бизнес-связей чаще лучше отдельная таблица.

Также полезно группировать схему комментариями и регулярно запускать:

npx prisma format
npx prisma validate

npx prisma format npx prisma validate

Итог: используйте явные relation names, отдельные join-модели, нормальные внешние ключи и не бойтесь дробить домен на несколько моделей. Prisma-схема должна описывать реальные отношения, а не быть списком всех возможных массивов на UserAccount.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно