one database, on purpose
That swamp gets built one reasonable decision at a time. The graph store arrived for the one feature with nodes. The document DB arrived because JSON felt awkward in columns. Each box solved a real problem the day it landed. Nobody ever schedules the day you take one back out.
Code Like Go strips language features until there's less to argue about. Same move, one layer down. Instead of reaching for a new box, you ask can Postgres do this? — and keep finding that it can. JSON, full-text, geospatial, vectors, queues, time-series, key-value. One engine, one connection string, one transaction that spans the lot. Delete the datastore. Buy back the glue. rm/acc, aimed at where your state lives.
Stonebraker built Ingres, then Postgres, at Berkeley. Won the Turing Award. Spent fifty years hammering one line: one size fits none. A column store beats a row store on warehouses by 10×. A stream engine looks nothing like either. This is the last man alive who should tell you to default to a single database — and he does, because his own rule has two ends. At the high end — a petabyte warehouse, a million writes a second — specialize or eat an order of magnitude. Everywhere else, which is nearly everywhere, reach for Postgres and start building. The rest of this is the long version of that sentence.
Start at The Default for the case from the ground up: what to reach for, when you're allowed to leave. Jump to The Extensible Core for the mechanism — why one engine swallows so many jobs. One throughline runs the whole way: every extra datastore is a cost you should be made to justify, never a box you reach for on reflex. Fewer moving parts. Correct while you sleep. Mostly Postgres.