Every few months, a new database shows up on Hacker News with a slick landing page, benchmarks that conveniently beat everything else, and a developer experience that makes you question your life choices. And every few months, teams start having The Conversation.
"Should we migrate to [shiny new thing]?"
No. Probably not. Sit down.
The Migration Fantasy
Here's how it usually goes. Someone on the team reads a blog post about how Company X switched from Postgres to NewHotDB and saw 47x performance improvements. The benchmarks look incredible. The API is cleaner. The docs have dark mode. It practically writes your queries for you.
What nobody mentions: Company X has 200 million daily active users, a dedicated infrastructure team of 40 people, and their specific workload happens to align perfectly with NewHotDB's architecture. You have a Django app with 3,000 users and your biggest table has 50,000 rows.
You don't have their problems. Stop borrowing their solutions.
Postgres Can Do That
I've lost count of how many times I've watched teams evaluate specialized databases for problems Postgres already solves:
-
"We need full-text search." Postgres has had
tsvectorandtsqueryfor over a decade. It's not Elasticsearch, but for 90% of use cases, it's more than enough. -
"We need to store JSON documents."
jsonbexists. It's fast. It's indexed. It's been battle-tested since 2014. - "We need vector search for AI." pgvector handles this. Is it as fast as a dedicated vector DB at massive scale? No. Do you operate at massive scale? Also no.
- "We need time-series data." TimescaleDB is literally a Postgres extension.
- "We need graph queries." Apache AGE gives you Cypher on Postgres. Or just use recursive CTEs — they're ugly but they work.
The pattern is clear: before you add a new database to your stack, check if Postgres already has an extension or feature that covers your needs. It almost always does.
The Real Cost Nobody Calculates
Adding a new database to your stack isn't just a technical decision. It's an operational commitment. You're signing up for:
- Another thing to back up. And test those backups. You do test your backups, right?
- Another thing to monitor. New dashboards, new alerts, new on-call runbooks.
- Another thing to secure. Network policies, authentication, encryption at rest. Per database.
- Data consistency headaches. The moment your data lives in two places, you've invented a distributed systems problem. Congratulations, you now get to think about eventual consistency at 3 AM.
- Hiring complexity. Your team needs to be proficient in multiple database paradigms. Good luck with that job listing.
Every database you add is a multiplier on your operational burden. And operational burden is the silent killer of engineering velocity.
When You Actually Should Switch
I'm not saying Postgres is always the answer. It's not. There are legitimate reasons to reach for something else:
- You genuinely need sub-millisecond key-value lookups at millions of requests per second. Redis or DragonflyDB makes sense here.
- You're doing real-time analytics on billions of rows. ClickHouse or DuckDB will genuinely change your life.
- You have a graph problem that's actually a graph problem — not just a few JOINs you're too lazy to write.
The key word is genuinely. Not "we might need this someday." Not "the benchmarks look cool." Not "everyone on Twitter is using it."
You should switch when your current database is a proven, measured bottleneck — when you've profiled, optimized indexes, tuned queries, and you're still hitting walls. That's the signal. Everything before that is noise.
The Boring Database Thesis
The best database for your project is the one your team already knows, already operates, and already trusts. For most teams, that's Postgres. For some, it's MySQL. For the brave, it's SQLite (which, by the way, is also criminally underrated for single-server applications).
Boring technology is a strategic advantage. Every hour you don't spend debugging a new database's quirks is an hour you spend building features your users actually care about.
Your Postgres is fine. Go build something instead.
Top comments (0)