В таком случае, когда эти профили действительно определены в соответствии с реальными критериями, я бы, вероятно, предложил использовать таблицы, выделенные для каждого типа.Однако в интересах полного раскрытия вы можете использовать систему EAV для их хранения.Что-то похожее на:
User:
UserID
...
ProfileID
Profile:
ProfileID
Name
Criteria:
CriteriaID
Name
ProfileCriteria:
ProfileID
CriteriaID
UserCriteria:
UserID
CriteriaID
Таблица Profile
определяет родительскую таблицу для профилей.У вас будет по одной строке для каждого из типов вашего профиля.
Criteria
определяет основные критерии, которые могут существовать в профиле, независимо от того, какой профиль (например, у вас могут быть одинаковые критерии дляболее одного профиля).
CriteriaProfile
служит для создания отношения am: m между Profile
и Criteria
.Здесь также можно добавить такие вещи, как сортировка для критерия в определенном профиле.
UserCriteria
указывает на конкретные значения пользователя для данного критерия.Это также позволит вам переключать профили для пользователя и поддерживать любые общие критерии, просто удаляя те, которые не были частью нового профиля.
HOWEVER
Структуры EAV идут с большими накладными расходами на обслуживание.Вместо того, чтобы полагаться на средства СУБД для управления структурированными данными (а это то, что людям платят много денег, чтобы придумать), теперь вы должны управлять ими самостоятельно.Таблицы имеют тенденцию становиться очень большими существенно быстрее, чем в не-EAV системах, так как у вас во много раз больше строк (так как теперь у вас есть строка для того, что было бы для каждого столбца в нормальной структуре).
EAV являются мощными и гибкими, но не всегда решением.Если ваши профили должны быть динамическими, то они могут быть подходящим инструментом.