Inteligentne projektowanie schematów
Wzorzec: Użyj AI do projektowania znormalizowanych, bezpiecznych typowo schematów z właściwymi relacjami i ograniczeniami.
// Zapytanie do asystenta AI"Zaprojektuj schemat Prisma dla platformy e-commerce z:- Architekturą wielodostępną (organizacje)- Rolami użytkowników i uprawnieniami- Katalogiem produktów z wariantami- Koszykiem i zamówieniami- Śledzeniem inwentarzaUwzględnij właściwe indeksy, ograniczenia i usuwanie miękkie"
// AI generuje kompleksowy schemat Prisma:generator client { provider = "prisma-client-js"}
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
// Baza wielodostępnamodel Organization { id String @id @default(cuid()) name String slug String @unique plan Plan @default(FREE) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relacje users User[] products Product[] orders Order[]
@@index([deletedAt]) @@map("organizations")}
// Zarządzanie użytkownikami z rolamimodel 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?
// Relacje organizationId String organization Organization @relation(fields: [organizationId], references: [id]) sessions Session[] cart Cart? orders Order[]
@@index([organizationId, deletedAt]) @@index([email]) @@map("users")}
// Katalog produktówmodel 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?
// Relacje organizationId String organization Organization @relation(fields: [organizationId], references: [id]) variants ProductVariant[]
@@unique([organizationId, slug]) @@index([organizationId, category, deletedAt]) @@index([isActive, deletedAt]) @@map("products")}
// Warianty produktów dla SKUmodel ProductVariant { id String @id @default(cuid()) sku String name String price Decimal @db.Money cost Decimal? @db.Money
// Inwentarz stockQuantity Int @default(0) lowStockThreshold Int @default(10) trackInventory Boolean @default(true)
// Atrybuty attributes Json @default("{}") images String[]
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime?
// Relacje productId String product Product @relation(fields: [productId], references: [id]) cartItems CartItem[] orderItems OrderItem[]
@@unique([productId, sku]) @@index([productId, deletedAt]) @@index([stockQuantity]) @@map("product_variants")}
// Koszyk zakupówmodel Cart { id String @id @default(cuid()) expiresAt DateTime @default(dbgenerated("NOW() + INTERVAL '7 days'")) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
// Relacje 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
// Relacje 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")}
// Zamówieniamodel 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)
// Ceny subtotal Decimal @db.Money tax Decimal @db.Money shipping Decimal @db.Money total Decimal @db.Money
// Informacje o kliencie (zdenormalizowane dla historii) customerEmail String customerName String
// Znaczniki czasowe placedAt DateTime @default(now()) paidAt DateTime? shippedAt DateTime? deliveredAt DateTime? cancelledAt DateTime?
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
// Relacje 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
// Migawka produktu (zdenormalizowana) productName String variantName String variantSku String
// Relacje orderId String order Order @relation(fields: [orderId], references: [id]) variantId String variant ProductVariant @relation(fields: [variantId], references: [id])
@@index([orderId]) @@map("order_items")}
// Enumeracjeenum 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")}
Korzyści generowane przez AI:
- Właściwa normalizacja ze strategiczną denormalizacją
- Kompleksowe indeksy dla częstych zapytań
- Wsparcie usuwania miękkiego w całym systemie
- Bezpieczne typowo enumeracje dla statusów
- Ścieżki audytu ze znacznikami czasowymi