// ============================================================================= // Presence Service - Prisma Schema // ============================================================================= generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // ============================================================================= // Heartbeat (在线心跳记录) // ============================================================================= model Heartbeat { id String @id @default(uuid()) installId String // 设备唯一安装ID sessionId String // 会话ID userId String? // 用户ID (可选,未登录时为null) timestamp DateTime // 心跳时间戳 createdAt DateTime @default(now()) @@index([installId, timestamp]) @@index([userId, timestamp]) @@index([sessionId]) @@index([timestamp]) @@map("heartbeats") } // ============================================================================= // Daily Active Users (DAU 日活统计) // ============================================================================= model DailyActiveUser { id String @id @default(uuid()) date DateTime @db.Date // 统计日期 (YYYY-MM-DD) installId String // 设备唯一安装ID userId String? // 用户ID (可选) firstSeen DateTime // 当日首次出现时间 lastSeen DateTime // 当日最后出现时间 createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([date, installId]) @@index([date]) @@index([userId, date]) @@map("daily_active_users") } // ============================================================================= // Online Presence (实时在线状态) // 使用 Redis 存储,此表仅用于历史记录 // ============================================================================= model OnlineSession { id String @id @default(uuid()) installId String // 设备唯一安装ID sessionId String @unique // 会话ID userId String? // 用户ID (可选) startTime DateTime // 会话开始时间 lastHeartbeat DateTime // 最后心跳时间 endTime DateTime? // 会话结束时间 (null表示仍在线) duration Int? // 会话时长 (秒) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([installId]) @@index([userId]) @@index([sessionId]) @@index([startTime]) @@map("online_sessions") } // ============================================================================= // DAU Statistics (DAU 统计汇总) // ============================================================================= model DauStatistics { id String @id @default(uuid()) date DateTime @unique @db.Date // 统计日期 totalDau Int // 总DAU (按installId去重) uniqueUsers Int // 唯一用户数 (按userId去重, 不含匿名) anonymousUsers Int // 匿名用户数 (userId为null) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([date]) @@map("dau_statistics") }