SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.08.2010 12:21:31

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Реализация EAV (Entity-Attribute-Value) с указанием типа атрибута

Здравствуйте, подскажите, как правильно реализовать паттерн Сущность-атрибут-значение (EAV) с указанием типа атрибута.

Структуру базы данных я прикрепляю картинкой к сообщению.
В таблице attributes_types хранятся типы атрибутов. В зависимости от типа, значение атрибута ищется в соответствующей таблице (attributes_int, attributes_decimal, attributes_text).

С такой структурой, чтобы выбрать все атрибуты товара, мне нужно выбрать сначала все описания атрибутов для конкретного товара:


SELECT *, attributes_types.name attr_type
FROM goods
LEFT JOIN categories on (goods.id_categories=categories.id_categories)
LEFT JOIN attributes_info on (categories.id_categories=attributes_info.id_categories)
LEFT JOIN attributes_types on (attributes_info.id_attributes_types=attributes_types.id_attributes_types)
WHERE goods.id_goods = 1
 

а потом уже делать по одному запросу на получение значения каждого атрибута в отдельности, при этом значения могут храниться в разных таблицах:

while ($attr = mysql_fetch_array($result)){
  $query = "SELECT * FROM attributes_".$attr['attr_type']." WHERE id_goods='".$attr['id_goods']."' AND id_attributes_info='".$attr['id_attributes_info']."'";
}
 


И все это не очень радует количеством запросов к бд roll Может можно как то лучше организовать хранение динамического количества атрибутов ? В поиске ничего не нашел. Есть только описание EAV, когда для хранения значений атрибутов используется одна таблица, без разделения по типам данных. А зачем мне например держать под всё, поле типа TEXT, если часто атрибуты будут иметь числовое или вообще булево значение.

Отредактированно Student20 (18.08.2010 12:22:40)


Прикрепленные файлы:
Attachment Icon eav with attr type.JPG, Размер: 69,223 байт, Скачано: 1,572

Неактивен

 

#2 18.08.2010 13:33:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Реализация EAV (Entity-Attribute-Value) с указанием типа атрибута

Любая общая схема, которая умеет всё, что угодно, работает медленнее
частной схемы, на одной и той же задачке. Разумное хранение произволь-
ных данных вполне реалистично в рамках того, что у Вас описано. Если
смущает количество запросов — можете объединять через UNION (но тогда
какой тип данных Вы предпочтете на выходе?). А если всегда будете объ-
единять, то какой смысл хранить в других форматах?

Обычно я рекомендую (если требуются быстрые выборки) делать несколько
табличек с разными типами товаров, и туда добавлять атрибуты, характер-
ные для этого типа товаров. Это вполне разумная денормализация, которая
позволяет значительно упростить логику самого приложения.

Кстати, количество запросов само по себе — это не страшная вещь, если
каждый запрос короткий и простой.

Неактивен

 

#3 18.08.2010 13:57:25

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Re: Реализация EAV (Entity-Attribute-Value) с указанием типа атрибута

paulus, Спасибо за ответ !

paulus написал:

Если смущает количество запросов — можете объединять через UNION (но тогда
какой тип данных Вы предпочтете на выходе?). А если всегда будете объединять, то какой смысл хранить в других форматах?

В описании товара обычно достаточно просто вывести все атрибуты товара. В этом случае было бы удобно объединить данные и на выходе получить соответственно всё в строковом типе.

Но в фильтрах, при поиске, нет необходимости делать объединение всех атрибутов, а нужно осуществить поиск по определенному полю, например проверить попадает ли размер диагонали телевизора в определенный диапазон.

paulus написал:

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

Спасибо smile Хороший вариант, может быть так и сделаю. Быстро и просто. Но, конечно большой минус, если типов товаров много, чтобы добавить новый тип, нужно добавлять новую таблицу и не так просто удалить\добавить новый атрибут, придется делать ALTER TABLE.

Видимо универсального решения нет, нужно выбирать, что больше подходит smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson