Отказ от ответственности : я не знаю PHP или CodeIgniter, но я бы хотел заявить, что ни у одного из них нет встроенной поддержки EAV.Тем не менее, я знаю много о EAV, поэтому я отвечу в этом свете.
Когда вы пишете о поиске определенного значения, я предполагаю, что вы имеете в виду и в конкретном поле.Итак, с учетом сказанного поместите данные в XML CLOB вне таблицы форм (например, в данные) и используйте функции MySQL XML для поиска по ним.Шутки в сторону.Допустим, XML выглядит следующим образом:
<data>
<field id="[field_id]">value</field>
</data>
Искать его так:
SELECT f.form_id
FROM
form f
WHERE
f.form_id = ?
AND ExtractValue(data, '//field[@id="[field_id]"]') = ?
Почему?Проблема в поиске нескольких критериев для модели EAV является сложной задачей.Рассмотрим этот пример:
SELECT f.form_id
FROM
form f
INNER JOIN form_fields f1 ON f1.form_id = f.form_id
INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE
f.form_id = ?
AND
(f1.field_id = ? AND f1.field_value = ?)
AND
(f2.field_id = ? AND f2.field_value = ?)
Все это выглядит хорошо и хорошо, теперь измените AND на ИЛИ и весь ад вырвется на свободу.
SELECT f.form_id
FROM
form f
INNER JOIN form_fields f1 ON f1.form_id = f.form_id
INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE
f.form_id = ?
OR
(f1.field_id = ? AND f1.field_value = ?)
OR
(f2.field_id = ? AND f2.field_value = ?)
Вы видите проблему?INNER JOIN в предложении FROM означает записи, независимо от того, что, данные возвращаются независимо от предложения WHERE.Таким образом, вместо JOIN в предложении FROM + предложении WHERE, EAV требует EXISTS в WHERE:
SELECT f.form_id
FROM
form f
WHERE
f.form_id = ?
AND (
EXISTS (
SELECT f1.form_id FROM form_fields f1
WHERE f1.field_id = ? AND f1.field_value = ? AND f1.form_id = f.form_id
)
-- note OR search
EXISTS (
SELECT f2.form_id FROM form_fields f2
WHERE f2.field_id = ? AND f2.field_value = ? AND f2.form_id = f.form_id
)
)
Какая уродливая а?Это и производительность подзапроса MySQL не очень хорошая .Добавьте при желании поиск по определенным типам данных, таким как даты и целые числа, и вы либо преобразуете данные, либо работаете с несколькими столбцами в таблице form_field (например, field_date_value, field_int_value и т. Д.).
Таким образом, XML CLOB означает только таблицу, которую следует учитывать при запросах, а также возможность многозначных атрибутов (на выбор приходят множественные выборки или флажки).