Как получить значения, имена и имена групп в одном запросе SQL - PullRequest
0 голосов
/ 03 января 2019

Раньше в MySQl 5.7 у меня была EAV shema с 4 таблицами:

  1. статьи
  2. атрибуты статьи
  3. имена атрибутов
  4. атрибутимена групп

После огромной сложности я узнал от другого вопроса , что это плохая шма.Таким образом, я избавился от таблицы 2, в которой все атрибуты были сохранены, и сохранил их либо со значениями, либо с value_ids непосредственно в таблицу 1, как предполагает модель STI.

Теперь я получил 3 таблицы:

  1. статьи
  2. имена атрибутов
  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
}

Это выглядит не очень элегантно.Как мне лучше спроектировать мою схему или как эти запросы можно переписать, чтобы получить значения в приемлемое время запроса?

...