Итак, в системе зарегистрированны пользователи, и у них есть параметры:
основные — логин, пароль, уникальный идентификатор, возможно, мыло. Без них, как понятно, никуда. Хранятся они обычно в одной таблице.
дополнительные — асько, васько, пол, дата рождения…
Как хранить дополнительные? Несколько вариантов:
Вариант номер раз
В той же таблице, в одной строке с основными.
Плюсы очевидны: нет лишних таблиц, запросы проще и быстрее, на отдельный столбец можно поставить различные типы и индексы.
Минусы: офигенно длинная таблица, жесткий набор параметров.
Например, у форумов куча столбцов - AIM, YIM, IRC… Из тысяч пользователей, дай бог, двое эти поля заполнят. Захотим добавить новый параметр — лезем в базу.
Для форумов, это возможно еще и ничего, но если делаем более/менее универсальную систему, данный вариант практически нерабочий.
Вариант номер два
Таблица со списком параметров:
1. Идентификатор
2. Название (мыло, аська…)
3. Другая фигня
Таблица привязки параметров к пользователям:
1. Ид.юзера
2. Ид.параметра
3. Значение параметра
Плюсы - набор легко расширять. Причем может расширять редактор из админки.
Минусы - менее эффективная выборка. Числовые значения приходится хранить в строках. И т.п.
Можно к каждому параметру добавить изменяемые характеристики. Тип параметра, уникальность (одинаковых емейлов у двух пользователей быть не может), формат ввода (строчка, текстарея, дата в виде селектов и т.п.). Потом на основании этих параметров можно автоматически строить формы регистрации, страницы с профилями и т.п.
Вариант номер три
Одна дополнительная связанная таблица:
1. Ид.юзера
2. Имя параметра
3. Значение параметра
Для повышения эффективности, конечно, можно сделать доп.таблицу, в которой бы автоматически кешировались имена, а в самой таблице были только их id. Но с точки зрения интерфейса, доступ к параметрам производился просто, примерно так:
setUserParam(10, 'email', '[email protected]'); // Установили значение параметра для 10-го юзера
getUserParam(11, 'email'); // Получили мыло 11-го пользователя
Плюсы: полная свобода, граничащая с анархией. Ставим какие хотим параметры и где хотим.
Минусы, по сравнению со вторым: отрисовывать и обрабатывать стандартные фишки, типа профилей или формы регистрации придется вручную. Но зато гораздо большая свобода выбора при этом. И это ничем не будет отличаться от пункта 2.
Доп.данные
Кроме вышеописанных "профильных" параметров, может существовать еще большое количество, связанных с каждым конкретным пользователем, данных. Какие-либо настройки интерфейса. Например, показываем таблицу, человек щелкнул по шапке, упорядочил по какому-то одному столбцу, ушел с сайта, вернулся, а состояние запомнилось, мелочь, а приятно :). При использовании варианта номер три, данные параметры можно объеденить с парамерами пользователя.
Как вы подобные вещи решаете? Какие мысли?