Overview
OneGlanse uses a dual-database architecture:- PostgreSQL - Transactional data (users, workspaces, auth)
- ClickHouse - Analytics data (prompts, responses, sources)
- PostgreSQL: Drizzle ORM
- ClickHouse: @clickhouse/client
Database Clients
PostgreSQL Client
Drizzle ORM provides type-safe queries:packages/db/src/clients/postgres.ts
packages/db/src/clients/postgres.ts:1-34
Usage:
ClickHouse Client
ClickHouse client for analytics queries:packages/db/src/clients/clickhouse.ts
packages/db/src/clients/clickhouse.ts:1-4
Configuration:
packages/db/src/config/clickhouse.ts
packages/db/src/config/clickhouse.ts:15-20
Usage:
PostgreSQL Schema
Workspaces Table
Stores workspace/brand information:packages/db/src/schema/workspace.ts
packages/db/src/schema/workspace.ts:18-30
Key Fields:
id: Unique workspace ID (e.g.,workspace_abc123)name: Display name (e.g., “Acme Corp”)domain: Brand domain (e.g., “acme.com”)tenantId: Organization ID (Better Auth)schedule: Cron expression for scheduled runsenabledProviders: JSON array of enabled AI providersdeletedAt: Soft delete timestamp
Workspace Members Table
Links users to workspaces:packages/db/src/schema/workspace.ts
packages/db/src/schema/workspace.ts:32-60
Authentication Tables
Better Auth manages these tables:packages/db/src/schema/auth.ts
ClickHouse Schema
User Prompts Table
Stores unique prompts per workspace:packages/db/clickhouse-init/schema.sql
packages/db/clickhouse-init/schema.sql:3-11
Purpose:
- Stores unique prompts (deduplicated by
workspace_id+prompt) - Uses
ReplacingMergeTreefor automatic deduplication - Efficient lookups by workspace
Prompt Responses Table
Stores AI responses and sources:packages/db/clickhouse-init/schema.sql
packages/db/clickhouse-init/schema.sql:13-35
Key Fields:
id: Unique response IDprompt_id: Links touser_prompts.idprompt: Denormalized prompt textmodel: Specific model (e.g., “gpt-4”)model_provider: Provider enum (chatgpt, claude, etc.)response: AI response in markdownsources: Array of source citationsis_analysed: Whether analysis has been runprompt_run_at: When the prompt was executed
- Monthly partitions by
prompt_run_at - Efficient time-based queries
- Automatic old partition cleanup (if configured)
Prompt Analysis Table
Stores brand intelligence analysis:packages/db/clickhouse-init/schema.sql
packages/db/clickhouse-init/schema.sql:37-54
Key Fields:
brand_analysis: JSON string containing analysis resultspresence: Boolean - is brand mentioned?rank: Number (1-10) - brand rank in responsesentiment_score: Number (-1 to 1) - sentimentcompetitors: Array - mentioned competitorsbest_known_for: String - what brand is known forpricing_perception: String - price positioningdifferentiators: Array - key differentiators
Migration Workflow
PostgreSQL Migrations
Drizzle Kit manages PostgreSQL schema migrations:packages/db/drizzle.config.ts
packages/db/drizzle.config.ts:10-19
Commands:
packages/db/drizzle/0000_famous_smiling_tiger.sql
ClickHouse Schema Changes
ClickHouse schema is managed via init scripts: Location:packages/db/clickhouse-init/schema.sql
Safe Schema Changes:
IF NOT EXISTS and IF EXISTS for idempotent migrations.
Querying Data
PostgreSQL Queries
Simple Select
Joins
packages/services/src/workspace/query.ts:96-114
Transactions
ClickHouse Queries
Basic Query
Time-Range Queries
Array Operations
Insert Data
Environment Variables
Performance Optimization
PostgreSQL Indexes
ClickHouse Optimizations
Partitioning:- Efficient time-range queries
- Drop old partitions for data retention
- Parallel processing per partition
- Fast workspace filtering
- Time-range scans
- Provider filtering
- Reduced storage for enums
- Faster filtering
- Better compression
- Automatic deduplication
- Eventual consistency
- Efficient upserts
Development Commands
Related Documentation
- Services Layer - Data access functions
- Web App - How the web app uses the database
- Agent Worker - How the worker stores data