Skip to main content

Architecture Patterns

Real-world deployment patterns showing where ekoDB fits in your stack. Choose the pattern that matches your workload.


The Core Principle​

Separate data processing from data serving. Your app should run fast while your backend handles the complexity of large datasets.

┌─────────────────────────────────────────────────────────────────────┐
│ Data Tiering Model │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Data Lake/Warehouse → Projection Layer → App Layer │
│ (Snowflake, Databricks) (PostgreSQL, ekoDB) (ekoDB/Redis)│
│ │
│ ▪ All data ▪ Scoped subsets ▪ Hot data │
│ ▪ Batch processing ▪ By user/group/project ▪ Sub-ms reads│
│ ▪ Analytics ▪ Transformed for app ▪ Sessions │
│ │
└─────────────────────────────────────────────────────────────────────┘

Not every app needs all three tiers. Match complexity to requirements.


Pattern 1: Simple CRUD​

Best for: MVPs, internal tools, straightforward applications

┌──────────────┐ ┌──────────────┐
│ │ │ │
│ Client │ ◄─────► │ ekoDB │
│ (Web/App) │ │ (Primary) │
│ │ │ │
└──────────────┘ └──────────────┘

Configuration:

  • Storage Mode: fast or balanced
  • Durability: durable for production

When to use:

  • Data fits on a single node
  • Queries are straightforward
  • No complex analytics requirements
  • Team wants minimal operational overhead

Example: Internal Dashboard

┌─────────────────┐ ┌─────────────────┐
│ React Admin │ │ ekoDB │
│ Dashboard │◄─────►│ │
│ │ │ ▪ Users │
│ ▪ User mgmt │ REST │ ▪ Settings │
│ ▪ Settings │ + │ ▪ Audit logs │
│ ▪ Reports │ WS │ ▪ Reports │
└─────────────────┘ └─────────────────┘

📚 See Basic Operations for CRUD examples and Storage Modes for configuration.


Pattern 2: Social Media Platform​

Best for: High read volume, real-time feeds, user-generated content

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌───────┐│
│ │ Warehouse│ │ PostgreSQL │ │ ekoDB │ │ Client││
│ │ (Spark) │───►│ (Primary) │───►│ (Cache + │◄──►│ Apps ││
│ │ │ │ │ │ Real-time) │ │ ││
│ └──────────┘ └──────────────┘ └──────────────┘ └───────┘│
│ │ │ │
│ │ Analytics & │ Live feeds │
│ └─────────ML Pipeline └────WebSocket │
│ │
└─────────────────────────────────────────────────────────────────────┘

Data Flow:

LayerTechnologyPurpose
Cold StorageSpark/DatabricksHistorical analytics, ML training
PrimaryPostgreSQLUser accounts, relationships, content
Hot LayerekoDBFeed cache, sessions, real-time notifications
ClientWeb/MobileUser-facing applications

ekoDB Role:

  • KV Store: User sessions, auth tokens (Fast mode)
  • Document Store: Feed cache by user/group (scoped projections)
  • WebSocket: Real-time notifications, typing indicators
  • Vector Search: Content recommendations

Example Configuration:

{
"storage_mode": "fast",
"durable_operations": false,
"collections": {
"sessions": { "ttl": "24h" },
"feed_cache": { "ttl": "5m" },
"notifications": { "ttl": "7d" }
}
}

Why this works:

  • PostgreSQL handles writes and complex queries
  • ekoDB serves read-heavy feed requests at high throughput
  • Scoped caching: each user sees only their feed, not the entire dataset
  • WebSocket eliminates polling for real-time features

📚 See Key-Value Store for session management and Basic Operations for real-time subscriptions.


Pattern 3: Financial Services​

Best for: Transactions, audit compliance, strong consistency requirements

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PostgreSQL │ │ ekoDB │ │ ekoDB │ │
│ │ (Ledger) │───►│ (Read Cache)│ │ (Audit Logs) │ │
│ │ │ │ │ │ Balanced Mode│ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ API Gateway │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Clients │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘

Data Flow:

LayerTechnologyModePurpose
LedgerPostgreSQLACIDCore transactions, balances
Read CacheekoDBFast + DurableAccount lookups, balance checks
AuditekoDBBalanced + DurableImmutable transaction history

Critical Configuration:

{
"ledger_cache": {
"storage_mode": "fast",
"durable_operations": true
},
"audit_logs": {
"storage_mode": "balanced",
"durable_operations": true
}
}

Why Balanced Mode for Audit:

  • Durable append-heavy writes with checkpoint batching to disk
  • Compact on-disk format for efficient disk usage
  • Immutable once written
  • Regulatory compliance friendly

Security Configuration:

  • AES-256-GCM encryption at rest
  • TLS/SSL in transit (HTTPS/WSS only)
  • JWT authentication with short TTL
  • Field-level access control

Example: Transaction Flow

1. Client requests transfer
2. API validates via ekoDB (session check, rate limit)
3. PostgreSQL executes transaction (ACID)
4. PostgreSQL confirms commit
5. ekoDB cache invalidated/updated
6. ekoDB Balanced logs audit entry (immutable)
7. Client receives confirmation

📚 See Transactions for ACID operations and Security for encryption details.


Pattern 4: E-Commerce Platform​

Best for: Product catalogs, shopping carts, search, recommendations

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────┐ ┌──────────────────────────────────────┐│
│ │ Warehouse │ │ ekoDB ││
│ │ (Analytics) │ │ ┌────────────┐ ┌────────────────┐ ││
│ │ │────────►│ │ Products │ │ Sessions/Cart │ ││
│ │ ▪ Sales │ │ │ (Catalog) │ │ (KV TTL) │ ││
│ │ ▪ Inventory │ │ └────────────┘ └────────────────┘ ││
│ │ ▪ Trends │ │ ┌────────────┐ ┌────────────────┐ ││
│ └──────────────┘ │ │ Search │ │ Vectors for │ ││
│ │ │ (Full-text)│ │ Recommendations│ ││
│ │ └────────────┘ └────────────────┘ ││
│ └──────────────────────────────────────┘││
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Storefront │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘

ekoDB handles everything in one binary:

FeatureTraditional StackekoDB
Product catalogPostgreSQLDocument collections
Product searchElasticsearchBuilt-in full-text
RecommendationsPinecone + ML serviceBuilt-in vector search
Shopping cartRedisKV with TTL
SessionsRedisKV with TTL
Real-time inventoryKafka + RedisWebSocket subscriptions

Example: Product Document

{
"sku": "WIDGET-001",
"name": "Premium Widget",
"description": "High-quality widget for all your needs",
"price": 29.99,
"inventory": 150,
"categories": ["widgets", "premium"],
"embedding": [0.1, 0.2, 0.3, ...] // 384-dim for recommendations
}

Search + Recommendations in one query:

// Full-text search
const results = await client.search("products", {
text: "premium widget",
fields: ["name", "description"],
fuzzy: true
});

// Similar products (vector search via search method)
const similar = await client.search("products", {
vector: currentProduct.embedding,
vector_field: "embedding",
vector_k: 5
});

Cart with TTL:

await client.kvSet(`cart:${userId}`, cartData, 86400); // TTL in seconds (24h)

Storage Mode Configuration:

{
"products": {
"storage_mode": "balanced",
"durable_operations": true
},
"sessions_cart": {
"storage_mode": "fast",
"durable_operations": false
},
"order_history": {
"storage_mode": "balanced",
"durable_operations": true
},
"inventory_updates": {
"storage_mode": "fast",
"durable_operations": true
}
}
Data TypeModeDurabilityWhy
ProductsbalancedtrueRead-heavy but updates matter, large catalog
Sessions/CartfastfalseEphemeral, TTL-based, regenerable
Order HistorybalancedtrueAppend-only, compliance, archival
InventoryfasttrueReal-time updates, must persist

📚 See Storage Modes for detailed mode comparisons and Basic Operations for CRUD examples.


Pattern 5: IoT / Time-Series​

Best for: Sensor data, logs, metrics, high write throughput

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Devices │ │ ekoDB │ │ Warehouse │ │
│ │ (Sensors) │───►│ Fast Mode │───►│ (Archival) │ │
│ │ │ │ (Ingestion) │ │ │ │
│ └──────────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │
│ WebSocket │ │
│ High throughput ▼ │
│ ┌──────────────┐ │
│ │ ekoDB │ │
│ │ Fast Mode │◄───── Dashboard/Alerts │
│ │ (Real-time) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘

Dual-Node Strategy:

NodeModePurpose
IngestionFast + Non-DurableHighest write throughput of any mode — see Performance Benchmarks
QueryFast + DurableReal-time dashboards, alerts

Why Fast Mode for Ingestion:

  • Highest measured write throughput of any mode
  • Minimal disk I/O overhead with durability off
  • Automatic archival to warehouse via Ripple

Configuration:

{
"ingestion_node": {
"storage_mode": "fast",
"durable_operations": false,
"ripple": {
"targets": ["query_node", "warehouse"]
}
},
"query_node": {
"storage_mode": "fast",
"durable_operations": true
}
}

Data Flow:

Sensor → ekoDB Fast (ingest) → Ripple → ekoDB Fast (query)
→ Ripple → Snowflake (archive)

📚 See Ripples for multi-node sync and Storage Modes for storage mode tuning.


Pattern 6: AI / RAG Application​

Best for: LLM applications, semantic search, chat with memory

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────┐ ┌──────────────────────────────────┐ │
│ │ Documents │ │ ekoDB │ │
│ │ (Upload) │───►│ ┌────────────┐ ┌────────────┐ │ │
│ │ │ │ │ Vectors │ │ Chat │ │ │
│ └──────────────┘ │ │ (Embeddings│ │ History │ │ │
│ │ │ + Search) │ │ (Branching)│ │ │
│ ┌──────────────┐ │ └────────────┘ └────────────┘ │ │
│ │ LLM │◄──►│ ┌────────────┐ ┌────────────┐ │ │
│ │ (OpenAI/ │ │ │ KV for │ │ Document │ │ │
│ │ Claude) │ │ │ Sessions │ │ Metadata │ │ │
│ └──────────────┘ │ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Chat UI │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘

ekoDB provides the complete RAG stack:

ComponentTraditionalekoDB
Vector storePinecone/WeaviateBuilt-in vector search
Document storePostgreSQLDocument collections
Chat historyRedis/PostgreSQLBuilt-in chat with branching
Session stateRedisKV with TTL
MetadataPostgreSQLSame document

RAG Workflow:

// 1. Store documents with embeddings
await client.insert("knowledge_base", {
content: "ekoDB is a multi-model database...",
embedding: await embed(content), // 384-dim
source: "documentation",
updated: new Date()
});

// 2. Semantic search for context
const context = await client.search("knowledge_base", {
vector: await embed(userQuery),
vector_field: "embedding",
vector_k: 5
});

// 3. Chat with memory (built-in branching)
const response = await client.chatMessage(sessionId, {
message: userQuery,
});

Chat Branching:

ekoDB's built-in chat system supports conversation branching:

Main conversation
├── Branch A (what-if scenario)
│ └── Continue exploring...
└── Branch B (alternative approach)
└── Different direction...

Storage Mode Configuration:

{
"knowledge_base": {
"storage_mode": "balanced",
"durable_operations": true
},
"chat_history": {
"storage_mode": "balanced",
"durable_operations": true
},
"sessions": {
"storage_mode": "fast",
"durable_operations": false
},
"embeddings_cache": {
"storage_mode": "fast",
"durable_operations": true
}
}
Data TypeModeDurabilityWhy
Knowledge BasebalancedtrueLarge documents, occasional updates, must persist
Chat HistorybalancedtrueAppend-only conversations, audit trail
SessionsfastfalseEphemeral user state, TTL-based
EmbeddingsfasttrueFrequently accessed vectors, expensive to regenerate

📚 See Chat & RAG for conversation management and Vector Search for embedding operations.


Storage Mode Quick Reference​

Choose the right combination for your data:

ModeDurableBest ForTrade-off
fasttrueUser data, account state, critical recordsHighest durability + speed
fastfalseSessions, caches, ephemeral dataMaximum speed, data loss on crash OK
balancedtrueLarge datasets, production workloadsGood balance for mixed read/write
balancedfalseDevelopment, bulk imports, migrationsFaster imports, not for production
balancedtrueAudit logs, compliance, archivalThe durable append-heavy choice
fastfalseHigh-throughput ingestion, metrics, logsHighest write speed of any mode; some loss acceptable

When to use each mode:

  • fast: Data fits in memory, sub-millisecond reads required
  • balanced: Datasets larger than RAM, mixed read/write workloads

Durability guidelines:

  • durable: true: Financial data, user records, anything you can't regenerate
  • durable: false: Caches, sessions, computed data, anything with TTL

📚 See White Paper for configuration options and Performance Benchmarks for detailed metrics.


Decision Matrix​

If you need...Use PatternStorage ModeDurabilityKey Features
Simple app, minimal ops1: Simple CRUDfast or balancedtrueSingle node, straightforward queries
High read volume, feeds2: Social Mediafastfalse for cacheWebSocket, TTL-based sessions
Strong consistency, audit3: Financialfast + balancedtrue alwaysLedger cache + immutable audit logs
Search + recommendations4: E-Commercebalanced + fastMixedFull-text + vectors + KV cart
High write throughput5: IoTfastfalse for ingestHighest write throughput, Ripple sync
LLM/RAG application6: AI/RAGbalancedtrueVectors + chat history + sessions

Storage Mode by Data Type​

Data TypeRecommended ModeDurabilityExamples
User accountsfasttrueProfiles, preferences, auth tokens
Sessions/cachefastfalseLogin sessions, API cache, rate limits
Large documentsbalancedtrueProduct catalogs, knowledge bases
Bulk importsbalancedfalseData migrations, batch uploads
Audit/compliancebalancedtrueTransaction logs, access logs
High-volume writesfastfalseMetrics, IoT sensors, clickstream

Anti-Patterns​

Don't do this:

Anti-PatternWhy It FailsInstead
Everything in one collectionNo isolation, hard to scaleSeparate by access pattern
Non-durable for financial dataData loss on crashAlways durable: true
Warehouse queries from appSlow, expensiveProject to ekoDB first
Polling for real-timeWasteful, laggyUse WebSocket subscriptions
Skipping the cache layerDatabase overload at scaleAdd ekoDB/Redis for hot data
fast + non-durable for user dataData loss on crashUse durable: true
Same mode for all collectionsMissed optimization opportunitiesMatch mode to access pattern
balanced for ephemeral cacheUnnecessary disk I/OUse fast + non-durable + TTL

Storage Mode Mistakes:

Wrong ChoiceProblemCorrect Choice
fast for 100GB+ datasetsMemory pressurebalanced
non-durable for ordersLost transactionsAlways durable: true
durable for computed cacheUnnecessary I/O overheadnon-durable + regenerate

Migration Path​

Start simple, add complexity as needed:

Stage 1: ekoDB only
↓
Stage 2: ekoDB + separate cache (if needed)
↓
Stage 3: PostgreSQL (writes) + ekoDB (reads/cache)
↓
Stage 4: Warehouse + PostgreSQL + ekoDB (full tiering)

Most applications never need Stage 4. Don't prematurely optimize.

Storage Mode Migration:

Start: fast + durable (simple, safe default)
↓
Scale: balanced + durable (dataset grows beyond RAM)
↓
Optimize: Mixed modes per collection (different access patterns)
↓
Enterprise: balanced for audit + fast for cache + balanced for data

See Also​

Core Documentation​

Advanced Topics​

Scaling & Operations​