When we reach for it
Almost every system we build. Constraints in the database are the last defence against bad data, and they hold when the application layer is bypassed by a migration, a script or a future service nobody has written yet.
A relational database with transactional guarantees, JSON when you need it, full-text search and a query planner that will tell you what it is doing — our default, and the one we have to be argued out of.
What we reach for first
Almost every system we build. Constraints in the database are the last defence against bad data, and they hold when the application layer is bypassed by a migration, a script or a future service nobody has written yet.
It is the wrong tool for genuinely enormous analytical scans, where a columnar warehouse is a different class of machine, and for a cache, where Redis exists. Neither is a reason to start elsewhere.
Migrations in the repository beside the code that needs them, foreign keys and check constraints written rather than assumed, and query plans read before an index is added. Most database performance work we are called into is a missing index and a query somebody let an ORM write.
Where this appears on the site
Derived from the stacks published on those pages, not written here — so this list cannot claim something the page it points at does not say.
Tell us what it is running, what it costs you today, and what you need it to do next. A senior engineer will tell you what we would keep and what we would change.