Оптимизация структуры моделей Prisma для улучшения читаемости и поддержки
Рассмотрим модель UserAccount, представленную в Prisma Schema. Её текущая структура включает множество полей и связей:
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")
}Возникает задача: в одном запросе получить профиль пользователя, создавшего определённую запись. Однако с этим связаны две ключевые проблемы:
- Сложность масштабирования: При увеличении количества связей в модели, её восприятие и анализ становятся чрезвычайно затруднительными.
- Отсутствие логической группировки: Нет чёткого разделения между основными бизнес-связями (например,
bookings) и техническими или служебными полями. Их смешение в одной схеме усложняет навигацию, хотя разделение без чёткой логики также может привести к потере смысловой целостности модели.
Цель - реорганизовать схемы в интуитивно понятные блоки. Это позволит:
- Сократить время на поиск нужных полей.
- Упростить поддержку и возвращение к коду спустя время.
- Повысить читаемость и ясность структуры данных.
К сожалению, на данный момент визуальных библиотек или общепринятых стандартов для подобной структуризации моделей Prisma практически нет. Это создаёт дефицит готовых решений и примеров, на которых можно было бы основываться или хотя бы черпать вдохновение для организации кода.