93 lines
3.1 KiB
Plaintext
93 lines
3.1 KiB
Plaintext
// =============================================================================
|
||
// 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")
|
||
}
|