dzheka3d
@dzheka3d

В каком формате хранить значения разных полей?

Всем привет! Делаю подобие доски объявлений...
Структура таблицы такая:
ads - таблица объявлений и общие значения типа "id", "заголовок", "описание", "цена"
fields - дополнительные поля (id поля, тип (список, число, текст, возможные ограничения и т.д.))
fields_value - значения полей, которые будут хранить id объявления, id поля и само значение

получается, что в последнюю таблицу (fields_value) нужно записать значения полей не зависимо от его типа в таблице `fields`. На ум приходит только формат ячейки VARCHAR, потому как числовые значения, текстовые до 255 символов или номер списка в любом случае будут в пределах, разрешенных в таблице `fields`. Но встает вопрос производительности. Например нужно найти объявления из категории "автомобили" где объем двигателя больше 2000куб.см. Выходит, что запрос нужно делать таким:

SELECT ads.*, fields_value.* 
FROM `fields_value` 
LEFT JOIN `ads` ON fields_value.`ad_id` = `ads`.`id`
WHERE `fields_value`.`val` > 2000 AND `ads`.`category_id` = 1


Но в `fields_value`.`val`, как я уже описал выше, могут ведь храниться и текстовые данные (если вдруг в объявление будет добавлено текстовое поле).

Как быть в таком случае? И что если вдруг в будущем стрельнет в голову сделать возможным добавлять не только текстовые поля до 255символов, а большие, в формате текст? Хотя второй вопрос не так актуален, ибо большой текст - это как правило только описание, которое можно хранить в отдельном поле TEXT в таблице `ads`.

Либо я создал совершенно не правильную структуру?
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
99% полей должны быть int. Там где пользователь руками что-то вводит - ВОЗМОЖНО text, varchar (описание, заголовок) большинство ввода все равно int (объем двигателя, пробег, етц). Все остальное в справочных таблицах, соответственно в записи самого объявления только индексы полей из справочников.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы