База данных и предназначена хранить данные. Любая внешняя система хранения, даже другая база, лишает вас функционала атомарных транзакций, вынуждая пилить связь и перенос данных и контроль за целостностью.
Теперь по способ хранения, когда ты в базе начинаешь изобретать универсальное хранилище key-entity-value, ты лишаешься значительной доли производительности и контроля за целостностью.
Правильно - заводить по полю в таблице user (лучше создать отдельную 1к1 связью, обслуживать ее будет проще). Если вы привыкли заводить атрибуты из интерфейса, то нет никакой особой разницы, делать это ddl alter table или dml insert (на самом деле есть, если записей миллионы или миллиарды, бд при удалении колонки пересоздает таблицу копированием, и это будет долго), а вот возможность создать индивидуальный индекс на каждый атрибут многого стоит.
Есть ещё варианты, например атрибуты boolean, если нет необходимости в null, можно хранить в отдельной таблице, фактом наличия записи (представь таблицу с единственным полем user_id), очень эффективно, если установленных значений много меньше всех записей.
И помни, если из-за аналитики поднимается нагрузка на основную базу, можно настроить репликации на другую году, и работать по аналитике именно с ней...