EAV запросы и таблицы - PullRequest
       22

EAV запросы и таблицы

0 голосов
/ 21 января 2012

Теперь у меня есть 4 таблицы:

table categories:
-id
-category

table products:
-id
-product
-price
-image

table attributes:
-id
-attribute
-product_id

table values:
-product_id
-attribute_id
-value

И я запрашиваю:

SELECT `id`, `product`, `price`, `image` FROM `products` WHERE `category_id` = $category->id

Теперь я получил массив продуктов для этой категории, и мне нужно получить его свойства:следующий запрос:

SELECT `products`.`id` AS `product_id`, 
`attributes`.`attribute`, 
`values`.`value` 
FROM `products` LEFT JOIN `attributes` ON (`attributes`.`product_id` = `products`.`id`) 
LEFT JOIN `values` ON (`values`.`product_id` = `products`.`id` 
AND `values`.`attribute_id` = `attributes`.`id`) 
WHERE `products`.`id` IN ($ids)

И он получает атрибуты со значениями, но меня интересует одна вещь: если возможно избавиться от столбца 'product_id' в table attributes и получить атрибуты и значения без этогостолбец?Теперь это целая куча дублирующих атрибутов, например:

table attributes 
-id 1
-attribute Weight
-product_id 1

-id 2
-attribute Weight
-product_id 2

Пока я хочу просто:

-id 1
-attribute Weight

извините за мой английский, если какая-то часть моего поста нуждается в дополнительных пояснениях, пожалуйста,я сейчас

1 Ответ

0 голосов
/ 21 января 2012

Зависит от того, хотите ли вы, чтобы ваши атрибуты были специфичными для продукта, но, очевидно, нет. Кроме того, вам не нужен product_id в таблице значений, если он есть в таблице атрибутов. Так что ваши таблицы имеют больше смысла, если они похожи на:

table categories:
-id
-category

table products:
-id
-product
-price
-image
-category_id

table attributes:
-id
-attribute
-product_id

table values:
-attribute_id
-value

На самом деле, я бы сделал это намного проще EAV:

table categories:
-id
-category

table products:
-id
-product
-price
-image
-category_id

table attributes:
-id
-product_id
-attribute
-value

И тогда ваш запрос будет выглядеть так:

SELECT id, product, price, image, attribute, value
FROM products
    INNER JOIN attributes ON products.id = attributes.product_id
WHERE products.category_id = :category_id

Убедитесь, что у вас есть соответствующие индексы. Кроме того, то, как вы хотели это сделать, выбрав идентификаторы продуктов и затем поместив их в IN, является плохой практикой.

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