Влияние производительности ORDER BY COALESCE в MySQL - PullRequest
2 голосов
/ 27 августа 2009

Моя общая проблема заключается в том, что я хочу, чтобы пользователи могли, по сути, добавлять произвольное количество полей разных типов, чтобы связать их с элементами. Итак, одним из решений, которое я рассматриваю, является следующее:

table `items`
item_id  |  name  

table `parameters`  
parameter_id  |  name  |  type

table `values`  
item_id  |  parameter_id  |  datetimevalue  |  datevalue  |  integervalue  |  etc...

Если пользователь хочет добавить параметр «Дата рождения» для некоторых своих элементов, мы добавим один параметр в таблицу параметров, а затем одну запись в таблице значений для каждого элемента, для которого он хочет иметь этот параметр. с датой, идущей в столбце datevalue, а все остальные поля 'value' остаются пустыми.

Чтобы упорядочить его предметы по «дате рождения», предположив, что для этого параметра параметр_id = 1, я бы сделал

SELECT * from 
items
join values on items.item_id = values.item_id
join parameters on parameters.parameter_id = values.parameter_id

where parameter_id = 1
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...)

Мой конкретный вопрос: будет ли этот ORDER BY исполнителем? Будет ли оно эффективно использовать индексы? Будет ли это делать ненужную работу?

Мой общий вопрос: является ли этот подход хорошей практикой? Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Вы говорите о моделировании EAV.

Взгляните на EAV моделирование

0 голосов
/ 03 сентября 2009

Этот ORDER BY COALESCE ... не сможет использовать индекс. ВАЖНО КОЛЕСС? Кажется, что если вы смотрите на один параметр, порядка по столбцам будет достаточно, потому что все значения будут одного типа.

Этот запрос сможет использовать индекс для (параметр_ид, datetimevalue, datevalue, integervalue), если вы только что сделали «ORDER BY datetimevalue, datevalue, integervalue».

Недостатки: 1) это выглядит немного грязно 2) если у вас много столбцов значений и если ваша таблица значений будет большой, этот индекс будет занимать пустое место и читать / записывать.

Возможно, вам будет лучше, если вы просто добавите столбец "sort_order" (или что-то еще) в таблицу значений и индексируете его. Кроме того, если вам действительно нужен COALESCE, потому что вы хотите отсортировать значения разных типов, вы можете выбрать метод sort_order, который будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...