Раньше в MySQl 5.7 у меня была EAV shema с 4 таблицами:
- статьи
- атрибуты статьи
- имена атрибутов
- атрибутимена групп
После огромной сложности я узнал от другого вопроса , что это плохая шма.Таким образом, я избавился от таблицы 2, в которой все атрибуты были сохранены, и сохранил их либо со значениями, либо с value_ids непосредственно в таблицу 1, как предполагает модель STI.
Теперь я получил 3 таблицы:
- статьи
- имена атрибутов
- имена групп атрибутов
Сначала это выглядело так, как будто мне стало легче, но при попытке заменитьпростой запрос, который получал все имена групп атрибутов и имена атрибутов определенной статьи. Я подумал, что это тоже не идеально.
Мой предыдущий запрос выглядел так:
SELECT
cag.name_de,
cag.attr_group_id,
attr.attr_de,
attr.attr_id
FROM
articles_attr aa,
cat_attr attr,
cat_attr_groups cag
WHERE
aa.article_id = '181206'
AND aa.attr_id = attr.attr_id
AND cag.attr_group_id = attr.attr_group_id
Теперь сновая схема, мне нужно, по крайней мере, это:
Получить все имена групп, например, "color"
SELECT
name_de,
attr_group_id
FROM
cat_attr_groups
Получить все косвенные значения, имеющие идентификатор, например, "green"
SELECT
attr.attr_group_id,
attr.attr_de
FROM
articles a,
cat_attr attr
WHERE
a.article_id = '181206'
AND (
(a.dial_c_id = attr.attr_id)
OR (a.dial_n_id = attr.attr_id)
OR (a.bracelet_color_id = attr.attr_id)
)
// pseudo code
$attr[$row->attr_group_id] = $row->attr_de;
Получить все прямые значения:
SELECT
jewels,
vibrations
FROM
articles a
WHERE
a.article_id = '181206'
// pseudo code
$attr[4] = $row->jewels;
Сопоставить имена групп с идентификаторами групп
foreach($attr AS $key => $value){
// somehow
}
Это выглядит не очень элегантно.Как мне лучше спроектировать мою схему или как эти запросы можно переписать, чтобы получить значения в приемлемое время запроса?