Database Architecture
Overview
The Refresh App Web uses Neon Postgres, a serverless Postgres database with multi-region support, integrated with Drizzle ORM for type-safe queries and Row-Level Security (RLS) for tenant isolation.
Database Platform
Neon Postgres
Key Features:
Serverless: Automatic scaling and connection pooling
Multi-Region: Primary write region with read replicas
Branching: Database branches for development
Point-in-Time Recovery: 30-day backup retention
Logical Replication: From staging to development
Architecture:
Primary Region: North America (us-east-1)
Read Replicas: Multiple regions for low-latency reads
Compute: Auto-scaling based on load
Storage: Separated from compute for efficient scaling
ORM & Query Builder
Drizzle ORM
Why Drizzle?
Type-safe SQL queries
Lightweight and performant
Excellent TypeScript integration
Edge-compatible (works in Cloudflare Workers)
Schema migrations
Key Features:
Database Schema
Core Tables
Authentication Tables:
users- User accountsaccounts- OAuth provider linkssessions- Active sessionsverification_tokens- Email verification
Tenant & Group Tables:
tenants- Multi-tenant organizationsgroups- Sub-groups within tenantstenant_users- User-tenant membershipsgroup_users- User-group memberships
Application Tables:
employee_data- Employee recordscalendar_events- Calendar data from integrationsproductivity_activities- Productivity trackingwellness_activities- Wellness trackingcrm_activities- CRM integration dataanalysis_reports- AI-generated reports
System Tables:
cache- Application-level cacheprocessing_jobs- Background job trackingsubscriptions- Billing and subscription dataprivacy_policies- Policy versions and acceptance
Schema Organization
Schemas organized by domain in src/lib/server/db/schema/. See Developer Database Guide.
Row-Level Security (RLS)
RLS Overview
What is RLS? Row-Level Security is a Postgres feature that automatically filters rows based on the current user's context. In this application, RLS uses JWT claims to enforce tenant isolation.
JWT Integration
RLS policies use JWT claims (tenant_id) to filter rows. See Authentication Flow and Multi-Tenancy.
Multi-Region Architecture
Region Configuration
Primary (Write) Region:
Location: North America (us-east-1)
Purpose: All write operations
Latency: Optimized for North American users
Read Replicas:
Regions: Multiple (e.g., Europe, Asia, Australia)
Purpose: Low-latency reads
Sync: Near real-time replication from primary
Connection Routing
Environment Variables:
Routing Logic:
Database Migrations
Migration Strategy
Tool: Drizzle Kit
Workflow:
Update schema files in
src/lib/server/db/schema/Generate migration:
pnpm db:generateReview migration SQL in
drizzle/directoryApply migration:
pnpm db:migrate
Migration Safety
Best Practices:
Always review generated SQL
Test in development first
Use transactions when possible
Avoid breaking schema changes
Keep migrations small and focused
Connection Management
Connection Pooling
Neon's Approach:
Serverless driver with built-in pooling
No persistent connections required
Edge-optimized for Cloudflare Workers
Configuration:
Connection Limits
Neon Limits:
Free Tier: 100 connections
Paid Tier: 1000+ connections
Auto-scaling: Automatically adjusts compute
Application Best Practices:
Use connection pooling
Close connections after use
Avoid long-running transactions
Use read replicas for reads
Logical Replication
Staging → Development Replication
Purpose:
Keep development database in sync with staging
Realistic testing data
Schema changes flow from staging to dev
Configuration: Managed in Neon dashboard:
Source: Staging database
Target: Development database
Replication: Logical replication (async)
Considerations:
Only schema changes replicated
Data may differ (dev can have test data)
One-way replication (staging → dev)
Caching Strategy
Application-Level Cache
Cache Table:
Usage:
In-Memory Cache
Session Cache:
LRU cache for user sessions
TTL: 1 hour
Reduces database queries
Background refresh
Performance Optimization
Query Optimization
Best Practices:
Use indexes on frequently queried columns
Select only needed columns (avoid
SELECT *)Use batch operations for bulk inserts
Leverage prepared statements
Example:
Index Strategy
Key Indexes:
Primary keys (automatic)
Foreign keys for joins
Tenant ID for RLS queries
Timestamp fields for filtering
Example:
Backup & Recovery
Neon Backups
Automatic Backups:
Continuous backup (WAL archiving)
30-day retention
Point-in-time recovery (PITR)
Recovery Options:
Restore to Timestamp: Restore database to specific point in time
Clone Branch: Create new branch from backup
Logical Replication: Replicate to new database
Disaster Recovery Plan
RTO (Recovery Time Objective): < 1 hour RPO (Recovery Point Objective): < 5 minutes
Steps:
Identify issue and timestamp
Create new Neon branch from backup
Test restored database
Update connection strings
Deploy updated configuration
Verify functionality
Security Considerations
Connection Security
TLS Encryption:
All connections encrypted in transit
TLS 1.2+ required
Certificate validation enforced
Credential Management:
Database URLs stored in AWS SSM
Never committed to git
Rotated periodically
Separate credentials per environment
Access Control
User Roles:
authenticated: Standard application user (via RLS)admin: Database administrator (manual operations)
RLS Enforcement:
All application queries filtered by tenant
No cross-tenant data access
Enforced at database level (not just application)
Audit Logging
Future Enhancement:
Track all data modifications
Log user actions with tenant context
Compliance and security auditing
Monitoring & Alerts
Metrics
Neon Dashboard:
Connection count
Query performance
CPU usage
Storage usage
Replication lag
Alert Triggers:
High connection count (> 80%)
Slow queries (> 1s)
High CPU usage (> 80%)
Replication lag (> 5 minutes)
Query Analysis
Slow Query Log:
Enabled in Neon dashboard
Identifies performance bottlenecks
Optimization opportunities
Related Documentation
Authentication Flow - JWT generation for RLS
Multi-Tenancy - Tenant isolation strategy
Security - Security model
Developer Database Guide - Development workflow
Last updated: October 2025
Last updated