// ============================================================================= // Presence Service - Prisma Schema // ============================================================================= generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // 事件日志表 (append-only) model EventLog { id BigInt @id @default(autoincrement()) userId String? @map("user_id") @db.VarChar(20) // userSerialNum, e.g. "D25121400005" installId String @map("install_id") @db.VarChar(64) eventName String @map("event_name") @db.VarChar(64) eventTime DateTime @map("event_time") @db.Timestamptz() properties Json? @db.JsonB createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz() @@index([eventTime], name: "idx_event_log_event_time") @@index([eventName], name: "idx_event_log_event_name") @@index([eventName, eventTime], name: "idx_event_log_event_name_time") @@index([userId], name: "idx_event_log_user_id") @@map("analytics_event_log") } // 日活统计表 model DailyActiveStats { day DateTime @id @map("day") @db.Date dauCount Int @map("dau_count") dauByProvince Json? @map("dau_by_province") @db.JsonB dauByCity Json? @map("dau_by_city") @db.JsonB calculatedAt DateTime @map("calculated_at") @db.Timestamptz() version Int @default(1) @@map("analytics_daily_active_users") } // 在线人数快照表 model OnlineSnapshot { id BigInt @id @default(autoincrement()) ts DateTime @unique @db.Timestamptz() onlineCount Int @map("online_count") windowSeconds Int @default(180) @map("window_seconds") @@index([ts(sort: Desc)], name: "idx_online_snapshots_ts") @@map("analytics_online_snapshots") }