What starts as "just expose some SQL over an API" reliably becomes a platform team.
Here's the cost breakdown nobody runs before starting.
How it escalates
The first version is genuinely small: a service, a connection pool, a few endpoints. Then the requirements arrive, one entirely reasonable ticket at a time.
| Phase | What gets added |
|---|---|
| Week 1 | Query endpoint, connection pooling |
| Month 1 | Connectors for the other three data sources |
| Month 2 | Access control — per user, then per row |
| Month 3 | Metadata so callers know what exists |
| Month 5 | Audit logging, because compliance asked |
| Month 7 | Caching, because the warehouse bill spiked |
| Month 9 | AI integration, because now agents need in |
| Ongoing | Someone owns all of it, permanently |
None of those are scope creep. They're the actual requirements, arriving in the order you discover them.
The three costs that don't appear in the estimate
Correctness at the edges. Join path resolution that's provably right, not usually right. Dialect differences across engines. Grain handling. This is where the real engineering time goes and it's invisible at design time.
Governance depth. Compile-time RBAC and ABAC with row and column predicates, per persona, applied before execution rather than after. Most in-house layers get to role-based filtering and stop, which is where the audit findings come from.
Permanent ownership. The layer needs an owner for as long as your data changes — long after the people who built it have moved on. That's a headcount line, not a project line.
The decision rule
Build when the semantic layer is your product. Buy when it's your infrastructure.
The failure mode is building it as infrastructure and discovering you now maintain a product with no customers but yourselves.
The full breakdown — the complete TCO model, phase-by-phase cost analysis, and the buy-vs-build framework — is here:
👉 The Hidden Cost of Building Your Own Data Access Layer
Originally published at colrows.com/blogs/the-hidden-cost-of-building-your-own-data-access-layer
Top comments (0)