Skip to content
All Posts
Technical Deep Dives

Capacity Planning with Graph Databases

1 August 20252 min read

When I started building the Engineering Intelligence Platform, I had a choice: relational database or graph database. I chose Neo4j, and that single decision shaped everything that followed.

The Relational Trap

Capacity planning in a relational model means lots of join tables. Engineer-to-skill mappings, engineer-to-project assignments, project-to-team relationships, skill-to-requirement matches. Every query that crosses these boundaries becomes a multi-join monster that is slow to write, slow to run, and impossible to maintain.

I tried the relational approach first with PostgreSQL. It worked for simple queries. But the moment someone asked "find me an engineer who knows TypeScript and Neo4j, is not on a critical-path project, and has worked with the payments team before," the query turned into five joins and a prayer.

Why Graphs Win Here

In Neo4j, that same query is a pattern match. Engineers are nodes, skills are nodes, projects are nodes. Relationships carry metadata like proficiency level, assignment dates, and utilization percentage. Traversing three hops in a graph is natural. Traversing three joins in SQL is painful.

The graph model also revealed patterns we never would have found in tables. We could see skill clusters — groups of engineers who shared overlapping expertise and could cover for each other. We could identify single points of failure — engineers who were the only person with a critical skill on a project.

The Hybrid Approach

I still use PostgreSQL for structured operational data: timesheets, project metadata, financial tracking. Neo4j handles the relationship-heavy queries. Qdrant provides vector search for semantic skill matching. Each database does what it does best.

The lesson for PMs who build: choose your data model based on the questions you need to answer, not the technology you already know. The right database makes hard problems trivial.


Back to all posts