производительность можно решить за счёт кеширования данных в redis, ну или использовать не реляционную базу данных, а документно-ориентированную, они больше предназначены для кастомных данных.
3 вариант, нарушает правила нормализации, 2 слишком запутанный, 1 вариант самый оптимальный не сильно нарушает нормализацию БД, и прост в реализации + достаточно легко будет искать данные.
вы что хотите оптимизировать код который выполняется миллионную долю секунды)) может лучше сначала проверить если такой ключ в базе redis, с помощью exists, а не сразу делать выборку?
миграции обычно создаются специальной библиотекой вашего языка программирования, а информации по этому вопросу в гуглу куча, так и ищите: миграции баз данных