Postgres JSON
Postgres supports two JSON types: JSON (stores the text verbatim) and JSONB (stores a parsed, indexed binary form). Use JSONB — it's faster to query, supports GIN indexes, and has richer operators. The practical effect: you can combine relational modelling (IDs, foreign keys, constraints) with schemaless columns for the parts that genuinely vary — user preferences, product attributes, API response caches, event payloads. This is what kills most "we need MongoDB because our data is flexible" arguments; Postgres will give you the flexibility and ACID plus joins. The trade-off to keep in mind: JSONB columns can't enforce structural constraints, so validation has to happen in the application or via CHECK constraints. And for truly hot documents with hundreds of fields and lots of querying, a purpose-built document DB can still win — but the bar is much higher than it sounds.