Лучше всего поместить все атрибуты в одну таблицу.
Если вы начинаете хранить имена атрибутов в таблице, вы сохраняете метаданные в своей базе данных, что нарушает первую нормальную форму.
Кроме того, хранение их в одной таблице упрощает ваши запросы.
Вы бы предпочли:
SELECT show_photos FROM User WHERE user_id = 1
Или
SELECT up.show_photos FROM User u
LEFT JOIN UserPrivacy up USING(user_id)
WHERE u.user_id = 1
Соединения в порядке, но сохраняют их для связывания отдельных сущностей и отношений 1-> N.
Существует ограничение на количество столбцов, и только если вы думаете, что можете достичь этого предела, вы сделаете что-нибудь еще.
Существуют законные причины для хранения пар имя-значение в отдельной таблице, но боязнь добавления столбцов не входит в их число. Например, создание таблицы значений имени может, в некоторых случаях, упростить вам запрос списка атрибутов. Однако большинство механизмов баз данных, включая PDO в PHP, включают методы отражения, благодаря которым вы можете легко получить список столбцов для таблицы (атрибуты для сущности).
Также обратите внимание, что в поле id пользователя должно быть имя_пользователя, а не просто идентификатор, если только вы не используете Ruby, который заставляет просто идентификатор. 'user_id' предпочтительнее, потому что при использовании только id ваши объединения выглядят так:
ON u.id = up.user_id
Что кажется странным, и предпочтительный способ таков:
ON u.user_id = up.user_id
или более просто:
USING(user_id)
Не бойтесь «добавить еще один атрибут». Это нормально и нормально.