Why We Still Over-Engineer: In Praise of Boring Relational Postgres
Why modern teams jump to microservices and NoSQL prematurely, and how a well-tuned relational schema solves 99% of web scale problems.
Why We Still Over-Engineer: In Praise of Boring Relational Postgres
By Aarav Mehta
There is a quiet dignity in tools that simply do their job without demanding a conference keynote every six months. In an era where every junior developer is pushed to build multi-region serverless meshes with vector embeddings and reactive streaming backplanes, PostgreSQL remains the undisputed anchor of sane engineering.
Yet, we continually watch teams dismantle perfectly healthy monolithic schemas in the name of "hyperscale readiness."
The Anatomy of Premature Microservices
The standard failure mode follows a predictable trajectory:
- A platform reaches 10,000 daily active users.
- A query on the posts table takes 80ms because nobody added an index on (authorid, publishedat DESC).
- Rather than running CREATE INDEX CONCURRENTLY, a architecture refactor meeting is called.
- The decision is made to extract comments into a separate Go microservice, authentication into an OAuth gateway, and feed generation into a DynamoDB stream.
Six months later, the team has six codebases, four CI/CD pipelines, no transactional consistency, and a monthly cloud bill that looks like a mortgage payment on a penthouse in Mumbai.
-- What most teams think they need microservices for:
-- Real reality: A partial index and a CTE is all you need for 10M rows.
create index concurrently if not exists idx_published_feed
on public.posts (published_at desc)
where status = 'published' and is_public = true;
ACID Is Not a Luxury
When you abandon relational integrity, you are not eliminating complexity; you are merely pushing it up into the application layer. Instead of relying on foreign keys and row-level locks verified by thirty years of database research, you now write manual saga orchestrators, compensating transactions, and distributed retry loops.
"Every distributed transaction you write manually is a bug you haven't discovered yet."
Build monoliths with clean internal domain boundaries. Leverage Postgres JSONB columns when you need schema flexibility. Use pg_trgm for fuzzy search before spinning up an Elasticsearch cluster.
When your platform actually hits 50 million users, you will have the revenue, team size, and architectural maturity to split services where domain seams naturally exist. Until then, cherish boring technology.