Лучший способ хранить «лишние» пользовательские данные в MySQL?

Я добавляю новую функцию в свой пользовательский модуль для своей CMS, и я наткнулся на препятствие ... Или я думаю, развилка на дороге, и я хотел узнать мнение о stackoverflow прежде чем я совершу что-либо.
В основном я хочу разрешить администраторам добавлять новые, «лишние» пользовательские поля, которые пользователи могут заполнять при регистрации, редактировать в своем профиле и / или управлять другими модулями. Примером этого может быть поле дня рождения, подробное описание себя или, возможно, баллы, заработанные пользователем на сайте. Излишне говорить, что хранимые данные будут разнообразными и могут варьироваться от больших объемов текста до небольших целых значений. Что еще хуже - я хочу, чтобы была возможность поиска в этих данных.

С учетом этого - как лучше всего это сделать? Сейчас я склоняюсь к созданию таблицы со следующими столбцами.

userid, refFieldID, varchar, tinyint, smallint, int, text, date, datetime, etc.

Я бы предпочел это, так как это значительно ускорит поиск, а справочная таблица (которая содержит все данные поля, такие как имя поля , независимо от того, доступен ли он для поиска и т. д. ) может указывать, какой столбец следует использовать при хранении данных для этого поля.

Другая идея, которая была предложена мне и использовалась в других решениях (vBulletin был одним из них, хотя я видел другие, чьи имена ускользают от меня на данный момент), где у вас есть только идентификатор пользователя, идентификатор ссылки и поле medtext. Я не знаю достаточно о MySQL, чтобы сказать это с какой-либо уверенностью, но похоже, что этот метод будет медленнее для поиска и, возможно, будет иметь большие накладные расходы.

Итак, какой метод будет «лучшим»? Есть ли еще один метод, который мне не хватает? Какой бы метод я ни использовал, он должен быть быстрым для поиска, а не массивным (небольшие накладные расходы - это нормально), и предпочтительно позволять сложные запросы, используемые для данных.

6
задан Serge 7 February 2011 в 03:47
поделиться