I created tables that store various sections of the quests in a row, rather than trying to store in some sort of JSONB or other format. You can't query nicely in those unless you have things split out into parts already.
Having said that, I pass back to my game client in a JSON format, but handle that on the server end.
I also split out quest sections into individual rows, so that a single quest can have multiple sections, requirements and potentially have to be performed in a specific order or concurrently. That allows my game client to know which quest part is active at any given time, making it easier to track advancements and progress, but also opening up different requirements as needed.
Lastly, I'd point out that whether you store the data in a normal row format, or each quest as an object ready to be passed to your game really, in the grand scheme of things, doesn't matter. You might have a different interface for your editor setup, and a different one for clients to query.
I have a development interface that lets my editor query, pass data, modify results etc but transform that when I promote the data, so that the load on the client-servers is minimised. Horses for Courses mate.