24/03/2026
Every RAG tutorial starts with a vector store. That's the problem.
Vector databases are optimized for one thing: finding semantically similar content. They're genuinely good at it. But when you ship to production, similarity search is maybe 30% of what your data layer actually needs to do.
When your agent serves multiple users, the vector store has no concept of data ownership. User A's documents and User B's documents are just embeddings in the same space. Filtering by user\_id, enforcing row-level security, checking subscription status before retrieval, running atomic updates on records - none of that is a vector database concern. That's relational territory.
The architecture that holds up in production splits the responsibility cleanly. A relational database (Postgres is the default choice for most teams) owns your structured state: users, permissions, metadata, billing records, transactional history. The vector store owns semantic retrieval only. They talk to each other through your application layer, not through one trying to do the other's job.
The failure mode is predictable. Builder ships a vector-only setup because that's what the tutorial showed. Works fine in testing with one user and clean data. Then in production they discover they can't filter results by account, can't enforce access control, can't run the transactional operations the business actually requires. They start patching it with prompt engineering and metadata hacks. That's the wrong fix for a data architecture problem.
If you're building this out, the terms worth researching are pgvector for Postgres-native vector search, Supabase for a managed hybrid approach, and Qdrant if you need a dedicated vector engine alongside a separate relational store. The key is modeling the foreign key relationship between your structured records and their corresponding embeddings from the start.
The vector store is a retrieval engine. Treating it as your full data layer is the architecture decision you'll regret at scale.