В вашем конкретном случае оптимальным вариантом было бы первое решение с джойнами. Об этом способе оптимизации БД уже давно известно, но от себя все же хочу добавить, что не стоит впадать в крайности и плодить кучу джойнов — достаточно будет одного. Т.е. создание отдельной таблицы для каждого поля (как например сделано в друпале) наоборот замедлит работу БД.
ЗЫ. Есть еще вариант сделать один столбец в таблице и хранить в нем дом поля в виде json, но в вашем случае вряд ли такой способ будет оправдан.