Infrastructure
JSONB or proper columns?
Measured on Postgres 16 at one million rows: jsonb costs 2.3x on disk and 1.4x on point lookups, both survivable. The number that actually hurts is the update path — one index on a jsonb column kills every HOT update and multiplies WAL by 7.8x, even when the update never touches the indexed field.