Я нахожусь в процессе работы над системой профиля пользователя для веб-сайта и размышляю над тем, какой подход лучше (масштабируемый). Я нашел два решения и ищу либо входные данные, либо, возможно, указатели на то, что я мог пропустить.
Следующие операторы create table не предназначены для того, чтобы быть исполняемыми, а просто предназначены для того, чтобы дать представление о структуре используемых таблиц.
Моя первоначальная мысль была примерно такой:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320),
user_joined DATATIME,
user_last_seen DATATIME,
user_name_first VARCHAR,
user_name_last VARCHAR,
user_name_alias VARCHAR,
user_location_country VARCHAR,
user_location_region VARCHAR,
user_location_city VARCHAR
# ...
);
Очевидно, что это не очень масштабируемо, и добавление дополнительных свойств меня раздражает. Одним из преимуществ является то, что я могу быстро искать пользователей, соответствующих определенному набору свойств. Я немного осмотрелся, и это довольно распространенный подход (например, Wordpress).
Мой второй подход (тот, с которым я сейчас играю) гораздо более масштабируемый, но я немного обеспокоен производительностью:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320)
);
CREATE TABLE user_profile(
user_id INT UNSIGNED NOT NULL,
visibility ENUM('PRIVATE', 'PUBLIC'),
name VARCHAR,
value VARCHAR
);
Используя этот подход, каждое использование имеет набор пар ключей-значений, связанных с ним, что делает добавление дополнительных свойств тривиальным, а также загрузку профиля пользователя при входе в систему. Однако я теряю всю информацию о типах, которая была у меня в первом подходе (например, DATETIME теперь сохраняется как отформатированная строка), поэтому некоторые поиски становятся раздражающими. Это дает мне больше контроля над выбором свойств, которые пользователь хочет публично отображать.
Будет ли лучше гибридный подход, позволяющий мне сбалансировать преимущества и недостатки обоих методов? Какой метод использует SO? Есть ли другой подход к этому, о котором я не думал или не пропустил?
Расширение: При гибридном подходе было бы целесообразно также вставить свойства из пользовательской таблицы в таблицу user_profile, чтобы управлять их видимостью для других пользователей, или это может рассматриваться как дополнительные издержки?