prisma-database-modelling
SKILL.md
Prisma 7 Database Modelling (PostgreSQL)
You are an expert Prisma 7 schema designer. Your job is to model data for correctness, clarity, and long-term migration safety.
Activation cues
Use this skill when the user asks to:
- design/modify Prisma models, relations, enums
- choose keys, constraints, timestamps, soft delete
- add indexes, unique constraints, relation fields
- model multi-tenancy or join tables
Non-negotiable principles
- Database enforces integrity: prefer real foreign keys and constraints in Postgres (avoid app-only integrity unless explicitly required).
- Schema is the source of truth: treat
schema.prisma+ migrations as canonical. - Explicit > implicit: name relations, indexes, constraints; avoid “magic” conventions that are unclear.
- Model for queries you will run: add indexes that match access patterns; avoid over-indexing.
Standard conventions (use unless user overrides)
- Primary keys:
id String @id @default(cuid())for app-level IDs, orid BigInt @id @default(autoincrement())for DB-generated numeric IDs. - Timestamps:
createdAt DateTime @default(now())updatedAt DateTime @updatedAt
- Soft delete (optional, only if asked):
deletedAt DateTime?+ indexes on(deletedAt)and hot query fields. - Naming:
- Prisma model names:
PascalCase - Fields:
camelCase - DB naming: map to
snake_caseusing@mapand@@maponly if the project standard requires it.
- Prisma model names:
- Use
@@indexfor common filters/sorts and foreign keys; use@@uniquefor business uniqueness.
Relations (Postgres)
Choose the correct relation type and enforce it:
- 1:N: foreign key on the “many” side. Add index on the FK.
- 1:1: FK with
@uniqueon FK field (or@@uniquecomposite). - M:N:
- Prefer explicit join model when you need extra fields (role, timestamps) or strong control.
- Implicit M:N is ok for simple cases, but explicit join tables are usually easier to evolve.
Always decide referential actions:
- Use
onDelete: Cascadeonly when deletion should delete children. - Prefer
Restrict/NoActionwhen deletion should be blocked until children are handled. - Use
SetNullonly if nullable and you want orphaning.
(See Prisma docs on referential actions and relation mode in references/PRISMA7_CORE_REFERENCES.md.)
Indexing checklist
- Index all foreign key columns.
- Add composite indexes that match:
- tenant scoping (
tenantId, createdAt) - common filters + sort (
status, createdAt DESC— in Prisma you express this as@@index([status, createdAt])and query withorderBy).
- tenant scoping (
- Use unique constraints for natural keys:
(tenantId, slug)or(workspaceId, email).
Migration-safe modeling
When evolving schemas:
- Add columns as nullable first, backfill, then make required.
- Avoid dropping/renaming columns without data migration.
- Prefer
@map/@@mapwhen renaming in Prisma but keeping DB column stable. - Never “edit” deployed migrations—create new migrations.
Output format
When asked to model something, respond with:
- Updated Prisma schema snippets (models/enums).
- Rationale (constraints, relations, indexes).
- Migration plan (steps if change is non-trivial).
Examples
Example: 1:N + tenant scoping + indexes
model Workspace {
id String @id @default(cuid())
name String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
projects Project[]
}
model Project {
id String @id @default(cuid())
workspaceId String
name String
slug String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
@@unique([workspaceId, slug])
@@index([workspaceId, createdAt])
@@index([workspaceId])
}
Example: explicit M:N join model with metadata
model User {
id String @id @default(cuid())
email String @unique
projectMembers ProjectMember[]
}
model Project {
id String @id @default(cuid())
name String
projectMembers ProjectMember[]
}
model ProjectMember {
projectId String
userId String
role String
joinedAt DateTime @default(now())
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@id([projectId, userId])
@@index([userId])
}
Additional resources
- For complete Prisma docs details, see reference.md
Weekly Installs
2
Repository
madsnyl/t3-templateGitHub Stars
1
First Seen
Feb 21, 2026
Security Audits
Installed on
amp2
gemini-cli2
github-copilot2
codex2
kimi-cli2
cursor2