Intelligent Schema Design
The Pattern: Use AI to design normalized, type-safe schemas with proper relationships and constraints.
// Prompt to AI Assistant"Design a Prisma schema for an e-commerce platform with:- Multi-tenant architecture (organizations)- User roles and permissions- Product catalog with variants- Shopping cart and orders- Inventory trackingInclude proper indexes, constraints, and soft deletes"
// AI generates comprehensive Prisma schema:generator client { provider = "prisma-client-js"}
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
// Multi-tenant basemodel Organization { id String @id @default(cuid()) name String slug String @unique plan Plan @default(FREE) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relations users User[] products Product[] orders Order[]
@@index([deletedAt]) @@map("organizations")}
// User management with rolesmodel User { id String @id @default(cuid()) email String @unique passwordHash String firstName String? lastName String? role UserRole @default(MEMBER) emailVerified Boolean @default(false) lastLoginAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relations organizationId String organization Organization @relation(fields: [organizationId], references: [id]) sessions Session[] cart Cart? orders Order[]
@@index([organizationId, deletedAt]) @@index([email]) @@map("users")}
// Product catalogmodel Product { id String @id @default(cuid()) name String slug String description String? category String basePrice Decimal @db.Money isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relations organizationId String organization Organization @relation(fields: [organizationId], references: [id]) variants ProductVariant[]
@@unique([organizationId, slug]) @@index([organizationId, category, deletedAt]) @@index([isActive, deletedAt]) @@map("products")}
// Product variants for SKUsmodel ProductVariant { id String @id @default(cuid()) sku String name String price Decimal @db.Money cost Decimal? @db.Money
// Inventory stockQuantity Int @default(0) lowStockThreshold Int @default(10) trackInventory Boolean @default(true)
// Attributes attributes Json @default("{}") images String[]
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relations productId String product Product @relation(fields: [productId], references: [id]) cartItems CartItem[] orderItems OrderItem[]
@@unique([productId, sku]) @@index([productId, deletedAt]) @@index([stockQuantity]) @@map("product_variants")}
// Shopping cartmodel Cart { id String @id @default(cuid()) expiresAt DateTime @default(dbgenerated("NOW() + INTERVAL '7 days'")) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
// Relations userId String @unique user User @relation(fields: [userId], references: [id]) items CartItem[]
@@index([expiresAt]) @@map("carts")}
model CartItem { id String @id @default(cuid()) quantity Int price Decimal @db.Money createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
// Relations cartId String cart Cart @relation(fields: [cartId], references: [id], onDelete: Cascade) variantId String variant ProductVariant @relation(fields: [variantId], references: [id])
@@unique([cartId, variantId]) @@map("cart_items")}
// Ordersmodel Order { id String @id @default(cuid()) orderNumber String @unique @default(dbgenerated("'ORD-' || TO_CHAR(NOW(), 'YYYYMMDD') || '-' || LPAD(nextval('order_seq')::TEXT, 6, '0')")) status OrderStatus @default(PENDING)
// Pricing subtotal Decimal @db.Money tax Decimal @db.Money shipping Decimal @db.Money total Decimal @db.Money
// Customer info (denormalized for history) customerEmail String customerName String
// Timestamps placedAt DateTime @default(now()) paidAt DateTime? shippedAt DateTime? deliveredAt DateTime? cancelledAt DateTime?
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
// Relations userId String user User @relation(fields: [userId], references: [id]) organizationId String organization Organization @relation(fields: [organizationId], references: [id]) items OrderItem[]
@@index([organizationId, status]) @@index([userId]) @@index([orderNumber]) @@map("orders")}
model OrderItem { id String @id @default(cuid()) quantity Int price Decimal @db.Money total Decimal @db.Money
// Product snapshot (denormalized) productName String variantName String variantSku String
// Relations orderId String order Order @relation(fields: [orderId], references: [id]) variantId String variant ProductVariant @relation(fields: [variantId], references: [id])
@@index([orderId]) @@map("order_items")}
// Enumsenum Plan { FREE STARTER PROFESSIONAL ENTERPRISE}
enum UserRole { OWNER ADMIN MEMBER READONLY}
enum OrderStatus { PENDING PROCESSING PAID SHIPPED DELIVERED CANCELLED REFUNDED}
model Session { id String @id @default(cuid()) token String @unique expiresAt DateTime createdAt DateTime @default(now())
userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([expiresAt]) @@map("sessions")}
AI-Generated Benefits:
- Proper normalization with strategic denormalization
- Comprehensive indexes for common queries
- Soft delete support throughout
- Type-safe enums for statuses
- Audit trails with timestamps