mirror of
https://github.com/umami-software/umami.git
synced 2026-02-10 07:37:11 +01:00
feat: Add UserMapping constraints and schema improvements
## Database Schema Enhancements ### Migration 19 - Fixed - Removed invalid composite index on session(visitor_id, user_id) - visitor_id column doesn't exist in session table - Fixed migration to only create valid indexes ### Migration 20 - New Constraints (with rollback support) - Added websiteId foreign key to UserMapping table - Added foreign key constraint to Website table for referential integrity - Added composite index on UserMapping(websiteId, userId) for query performance - Added composite index on Session(websiteId, userId) for join optimization ### Schema Updates - Updated UserMapping model with websiteId field - Added foreign key relationship: UserMapping -> Website - Added userMappings relation to Website model - Added composite indexes for better query performance ## Files Changed ### Modified - prisma/schema.prisma - Added foreign keys and composite indexes - prisma/migrations/19_add_user_id_mapping/migration.sql - Fixed invalid index ### New - prisma/migrations/20_add_user_mapping_constraints/migration.sql - Forward migration - prisma/migrations/20_add_user_mapping_constraints/rollback.sql - Rollback script ## Benefits - ✅ Referential integrity enforced at database level - ✅ Optimized queries for Umami sync operations - ✅ Better join performance on Session table - ✅ Rollback capability for safe schema changes ## Breaking Changes - UserMapping table now requires websiteId field - Existing data will be migrated to use first available website_id ## Migration Notes Run the migration with: ```bash npx prisma migrate deploy ``` To rollback if needed: ```bash psql -d umami -f prisma/migrations/20_add_user_mapping_constraints/rollback.sql ```
This commit is contained in:
parent
5cf1e0c16a
commit
7c1db78050
4 changed files with 70 additions and 11 deletions
|
|
@ -43,6 +43,7 @@ model Session {
|
|||
region String? @db.VarChar(20)
|
||||
city String? @db.VarChar(50)
|
||||
distinctId String? @map("distinct_id") @db.VarChar(50)
|
||||
userId String? @map("user_id") @db.VarChar(36)
|
||||
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
|
||||
websiteEvents WebsiteEvent[]
|
||||
|
|
@ -52,6 +53,8 @@ model Session {
|
|||
@@index([createdAt])
|
||||
@@index([websiteId])
|
||||
@@index([websiteId, createdAt])
|
||||
@@index([userId])
|
||||
@@index([websiteId, userId])
|
||||
@@index([websiteId, createdAt, browser])
|
||||
@@index([websiteId, createdAt, os])
|
||||
@@index([websiteId, createdAt, device])
|
||||
|
|
@ -76,14 +79,15 @@ model Website {
|
|||
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
|
||||
deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
|
||||
|
||||
user User? @relation("user", fields: [userId], references: [id])
|
||||
createUser User? @relation("createUser", fields: [createdBy], references: [id])
|
||||
team Team? @relation(fields: [teamId], references: [id])
|
||||
eventData EventData[]
|
||||
reports Report[]
|
||||
revenue Revenue[]
|
||||
segments Segment[]
|
||||
sessionData SessionData[]
|
||||
user User? @relation("user", fields: [userId], references: [id])
|
||||
createUser User? @relation("createUser", fields: [createdBy], references: [id])
|
||||
team Team? @relation(fields: [teamId], references: [id])
|
||||
eventData EventData[]
|
||||
reports Report[]
|
||||
revenue Revenue[]
|
||||
segments Segment[]
|
||||
sessionData SessionData[]
|
||||
userMappings UserMapping[]
|
||||
|
||||
@@index([userId])
|
||||
@@index([teamId])
|
||||
|
|
@ -330,3 +334,22 @@ model Pixel {
|
|||
@@index([createdAt])
|
||||
@@map("pixel")
|
||||
}
|
||||
|
||||
model UserMapping {
|
||||
id Int @id @default(autoincrement())
|
||||
websiteId String @map("website_id") @db.Uuid
|
||||
visitorId String @map("visitor_id") @db.VarChar(36)
|
||||
userId String @map("user_id") @db.VarChar(36)
|
||||
firstSeenAt DateTime @default(now()) @map("first_seen_at") @db.Timestamptz(6)
|
||||
lastSeenAt DateTime @default(now()) @map("last_seen_at") @db.Timestamptz(6)
|
||||
sessionCount Int @default(1) @map("session_count")
|
||||
|
||||
website Website @relation(fields: [websiteId], references: [id])
|
||||
|
||||
@@unique([visitorId, userId])
|
||||
@@index([visitorId])
|
||||
@@index([userId])
|
||||
@@index([lastSeenAt])
|
||||
@@index([websiteId, userId])
|
||||
@@map("user_mapping")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue