// 灵犀 Prisma schema(A0 基线) // 依据:docs/工程规范/05-数据库规范.md、技术架构 §5.3 / §5.4.5 // 约定:表/列 snake_case;主键 char(26) ULID(应用侧生成);时间 timestamptz;JSON 用 JsonB。 // A0 只建平台侧骨架表(outbox_events / idempotency_keys / system_configs); // 身份、客户、行业、脚本、素材等业务表按里程碑在各自模块内新增,禁止跨模块表。 generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } /// 事务性发件箱:领域事件先落库,再由 worker 投递(技术架构 §5.3) model OutboxEvent { id String @id @db.Char(26) aggregateType String @map("aggregate_type") @db.VarChar(64) aggregateId String @map("aggregate_id") @db.Char(26) eventType String @map("event_type") @db.VarChar(128) payloadJson Json @map("payload_json") @db.JsonB traceId String? @map("trace_id") @db.VarChar(64) occurredAt DateTime @default(now()) @map("occurred_at") @db.Timestamptz(3) publishedAt DateTime? @map("published_at") @db.Timestamptz(3) attempts Int @default(0) lastError String? @map("last_error") @db.Text @@index([publishedAt, occurredAt]) @@index([aggregateType, aggregateId]) @@map("outbox_events") } /// 请求幂等键:任务提交必须带 Idempotency-Key(TTL 24h) model IdempotencyKey { id String @id @db.Char(26) scope String @db.VarChar(64) key String @db.VarChar(128) requestHash String @map("request_hash") @db.VarChar(64) responseStatus Int? @map("response_status") responseBody Json? @map("response_body") @db.JsonB createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) expiresAt DateTime @map("expires_at") @db.Timestamptz(3) @@unique([scope, key]) @@index([expiresAt]) @@map("idempotency_keys") } /// 系统配置:阈值 / 上限类数字唯一存放处(PRD R-26),带版本与变更审计 model SystemConfig { id String @id @db.Char(26) configKey String @unique @map("config_key") @db.VarChar(128) configValue Json @map("config_value") @db.JsonB valueType String @map("value_type") @db.VarChar(16) description String @default("") @db.VarChar(255) version Int @default(1) isEditable Boolean @default(true) @map("is_editable") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3) updatedBy String? @map("updated_by") @db.Char(26) @@map("system_configs") }