Spring GDS 25th Anniversary
A logistics company that ships to 190 countries built something to ship to itself.
Object-relational mapping is a layer that lets you work with a relational database through the objects of your programming language instead of raw SQL. A row in a users table becomes a User object. Reading, creating, and updating records happens through method calls, and the ORM generates the SQL underneath. Database columns map to object fields, relationships map to references between objects.
The point is to keep developers in one mental model. You think in objects and relationships, not in joins and table aliases, and the ORM also handles tedious, error-prone details like escaping inputs to prevent SQL injection. The trade-off is a layer of abstraction that can hide what the database is actually doing. The classic trap is the N+1 query problem, where loading a list and then touching each item's relations fires hundreds of small queries instead of one efficient join. A team listing 50 blog posts with their authors can accidentally trigger 51 queries through an ORM, when a single join would have done it, unless they tell the ORM to load the relation eagerly.
Prisma, TypeORM, Drizzle, Sequelize, Hibernate, and Django's ORM are common examples. Most support dropping to raw SQL for the queries the abstraction handles poorly.
We use an ORM for the bulk of an application's data access, because it makes the common cases fast to write, safe against injection, and easy to read months later. Where it earns its keep is the ninety percent of queries that are straightforward. The discipline is knowing the other ten percent exists, and not pretending the database has disappeared just because there is a tidy object in front of it.
So we watch the queries an ORM actually generates, especially the N+1 patterns that look innocent in code and crush a database under real load. For the heavy reports and complex aggregations where an ORM fights the problem, we drop to hand-written SQL and keep it readable. That balance of productivity and control runs through our custom web application development and web development work, where the data layer quietly decides whether a product stays fast as it grows.
App slowing down as your data grows? The query layer is often the culprit. Let's take a look.
A logistics company that ships to 190 countries built something to ship to itself.
Turning a brand into a working business.
Half a million people. One app. Zero chaos.















