Insights · Engineering · Jan 1, 2025 · 7 min read
Choosing a database in 2026: why PostgreSQL is the boring default
For most products the right database is PostgreSQL. A practical guide to when document stores, SQLite, Redis-class caches, vector search and warehouses genuinely earn a place, and the real cost of migrating later.
Forecast engine
Demand forecast - next 8 weeks
94.2%
Accuracy
+18%
Vs baseline
8w
Horizon
Retrained nightly on 14 months of order behaviour.
For most products in 2026, the right database is PostgreSQL, and the burden of proof sits with anything else. Document stores, SQLite, Redis-class caches, vector indexes and analytical warehouses all have legitimate roles, but they earn their place by solving a specific problem PostgreSQL handles poorly — not by being fashionable. This guide walks through when each one genuinely earns its keep, and what it actually costs to change your mind later.
Key takeaways
- PostgreSQL is the default because it handles relational, JSON, full-text and vector workloads well enough for most products, with mature tooling and a deep talent pool.
- Document stores earn a place when your data is genuinely document shaped and varies by record — not as a way to avoid designing a schema.
- SQLite is a serious production choice for on-device, embedded, local-first and single-writer workloads, not a toy.
- Caches and vector indexes are companions to your system of record, never replacements for it.
- Migration cost lives mostly in application code, queries and operational habits, so the cheapest migration is the one you avoid by choosing boring first.
Why is PostgreSQL the boring default?
PostgreSQL has been in continuous open-source development for decades, and that longevity shows up everywhere that matters: query planning, transactional integrity, replication, extensions and documentation. It is a relational database first, but its JSONB type handles semi-structured data well enough that many teams never need a separate document store. Full-text search is built in. The pgvector extension adds similarity search over embeddings. The major clouds all offer a managed PostgreSQL service, which means backups, failover and patching are a checkbox rather than a project.
Just as important is the human side. SQL and relational modelling are common ground for developers, so hiring is easier, code review is sharper and the answer to almost any operational question already exists in public. When we build a web application for a client, PostgreSQL is our starting assumption precisely because it removes an entire category of decisions from the project. Boring, in this context, is a compliment.
The best database decision is usually the one your team stops thinking about. Boring is not a limitation. It is the point.
That does not make PostgreSQL universal. It wants a schema, it runs as a server, and a single primary node has real limits for write-heavy workloads at large scale. The rest of this article covers the cases where those limits genuinely bite.
When does a document store earn its place?
Document databases such as MongoDB store records as self-contained documents rather than rows across tables. They earn their place when the data itself is document shaped: a product catalogue where every category carries different attributes, CMS content with deeply nested blocks, event payloads from third-party systems you do not control, or user-generated structures that vary record by record.
The honest caveat is that PostgreSQL's JSONB covers a large share of these cases, with the bonus that your flexible data can sit next to your relational data in one system, inside one transaction. A document store is most defensible when the document model is the whole application, when your team already runs one well, or when you need its specific replication and sharding behaviour.
What a document store should never be is an excuse to skip schema design. Relationships always creep into real products — orders reference customers, comments reference posts — and reimplementing joins in application code is slower to write and easier to get wrong than letting a relational engine do its job.
Is SQLite serious enough for production?
Yes, in the right shape of system. SQLite is an embedded library, not a server: the database is a single file, and reads are extraordinarily cheap because there is no network hop at all. That makes it the standard choice inside mobile apps, desktop software and embedded devices, and it is why local-first and edge architectures lean on it heavily. Some teams also run modest web services on SQLite, with replication tooling for durability, and per-tenant SQLite files are one established pattern for multi-tenant products.
Its constraint is concurrency: SQLite allows one writer at a time. For read-heavy workloads that is rarely a problem; for a busy transactional system with many concurrent writers, it is disqualifying. Treat SQLite as a precise tool for on-device, embedded, single-writer and test-fixture workloads — serious, but scoped.
What are Redis-class caches actually for?
Redis and compatible in-memory stores such as Valkey keep data in memory rather than on disk. They exist to make hot data fast: session storage, rate limiting, leaderboards, queues, pub-sub messaging and cached query results. Used this way, a cache can take enormous pressure off your primary database and make an application feel immediate.
The discipline that keeps caches safe is a single rule: a Redis-class store should only hold data you can afford to lose or rebuild. The moment it becomes the only home of something irreplaceable, you have quietly adopted a second system of record with weaker durability guarantees than your first. Persistence options exist, but they are a safety net, not a foundation. Keep the source of truth in PostgreSQL; let the cache be a cache.
Do you need a vector database or a warehouse?
Two further categories deserve their own decision. Vector search powers retrieval for AI features: semantic search, recommendations and retrieval-augmented generation. For most products, pgvector inside PostgreSQL is enough — your embeddings live beside the rows they describe, filtered by the same permissions and joined in the same queries. A dedicated vector database earns consideration when the corpus is very large, when index build and recall tuning become a full-time concern, or when vector search is the product rather than a feature of it.
Analytical warehouses such as BigQuery and Snowflake answer a different question. Transactional databases are built for many small reads and writes; warehouses are built for scanning huge histories to answer business questions. When dashboards and reports start competing with customers for your primary database's attention, it is time to copy data out to a warehouse and let each system do what it is shaped for. Products in both categories move quickly, so treat the specifics here as current at the time of writing.
| Option | Best fit | What it does well | Watch out for |
|---|---|---|---|
| PostgreSQL | The system of record for most products | Relational integrity, JSONB, full-text, vectors via pgvector, mature managed services | Write-heavy scale beyond one primary takes planning |
| Document store | Genuinely document-shaped, per-record variable data | Flexible documents, horizontal sharding | Relationships creep in; joins move into your code |
| SQLite | On-device, embedded, local-first, single-writer services | In-process reads with no network hop, one-file simplicity | One writer at a time; not a network server |
| Redis-class cache | Sessions, queues, rate limits, hot data | In-memory speed, simple data structures | Never the only copy of irreplaceable data |
| Warehouse | Analytics over large histories | Scanning and aggregating at scale, separate from production load | Not for transactional reads and writes |
What does a database migration really cost?
Teams usually price a migration as the effort of moving the data. In practice, moving the data is the cheap part. A workable estimate looks like this: total cost = query and code rewrites + data movement and backfill + a dual-running period + operational retraining + the risk of subtle behavioural differences. Every query your application makes touches assumptions about transactions, locking, consistency and error handling, and those assumptions rarely transfer cleanly between engines.
The dual-running period is where budgets go to die. For any system that matters, you cannot switch overnight; you run old and new side by side, keep them in sync, compare results and cut over gradually. During that window you pay for two systems, two sets of monitoring and every bug that only appears in one of them. Then comes the long tail: runbooks, backup procedures, on-call instincts and performance intuition all reset to zero on the new engine.
Three practical conclusions follow. First, choose boring at the start, because the cheapest migration is the one you never need. Second, when a migration is justified, move one workload at a time — carve the cache, the search index or the analytics load off your primary database rather than replacing it wholesale. Third, keep the system of record stable and let the specialised systems around it be replaceable.
How OlDevs helps you choose and build
OlDevs is a full-stack technology studio in Vancouver, building software since 2014. Database decisions run through nearly everything we ship, from web and mobile applications to AI features, and our bias is exactly what this article describes: PostgreSQL by default, specialised engines only when the workload proves the need. You can read more about how we approach data and databases across our projects.
You get one accountable team, a working demo every week, and full ownership of all code, designs, accounts and IP. We work with clients across Canada and beyond remotely, with video calls in your time zone and on-site visits when the work calls for it. If you are weighing a database choice for a new build, or staring down a migration you would rather not get wrong, request a quote and we will reply within one business day.
FAQ
Questions on this topic.
For most products, yes. PostgreSQL handles relational data, JSON documents, full-text search and vector similarity via the pgvector extension in one engine, with managed services on the major clouds. Specialised databases earn a place only when a specific workload proves PostgreSQL cannot serve it well.
Yes, in the right shape of system. SQLite is a standard choice for mobile apps, embedded devices, local-first software and modest single-writer services. Its limit is one writer at a time, so busy transactional systems with many concurrent writers need a server database such as PostgreSQL instead.
The dual-running period. Serious systems cannot cut over instantly, so you run old and new engines side by side, keep them in sync and compare results while paying for both. Add query rewrites, operational retraining and subtle behavioural differences, and moving the data itself becomes the cheap part.
Keep reading
More from the studio.
Web security and privacy in 2026: what changed and what to do now
Passwords gave way to passkeys, privacy law arrived in force, accessibility got deadlines and AI added new risks. What changed through 2026 and the checklist to…
Performance marketing that proves itself: attribution basics for non-marketers
Attribution decides which marketing gets credit for a sale. No model is perfect; the aim is a fair, consistent method that shows where budget actually works.
What an AI copilot actually costs to run in production — and how to keep it reliable
Model fees are the smaller share of a copilot's running cost. Tokens, latency, monitoring and guardrails are the larger one, and they decide whether it stays…
Let’s connect
Want this applied to your business?
Tell us what you’re building. We’ll reply within one business day with next steps and a tailored quote.
Thanks — we’ll reply within one business day.