Посоветуйте структуру БД

hudrone

Новичок
Посоветуйте структуру БД

Тема такая:
Есть большое количество разношерстных товаров со своим набором характеристик. У разных товаров хар-ки разные и их количество варьируется. Вопрос в том, как лучше сделать (более эффективно) – вынести все хар-ки в отдельную таблицу, связав их с товаром или понаделать полей с запасом в таблице товаров? Второй вариант мне категорически не нравится, но я не никак не могу придумать как (в случае первого варианта) сделать выборку товаров у которых, например, параметр1 = 22, параметр2 = 33 и параметр3 > 10.

Для ясности назовем таблицы Goods и Params, с первой все понятно у второй структуру я вижу как Param_Id, Goods_Id, Param_Name, Param_Value.

Всем заранее спасибо.
 

Socrat

Новичок
ИМХО - по букварю ;):

1 таблица: Goods
2 таблица: Params_name
3 таблица: Params_Value содержит: Goods_id, Params_name_id, params_value

И Все - схема класическая и в комментариях не нуждается(по моему)
 

Socrat

Новичок
ИМХО - по букварю ;):

1 таблица: Goods
2 таблица: Params_name
3 таблица: Params_Value содержит: Goods_id, Params_name_id, params_value

И Все - схема класическая и в комментариях не нуждается(по моему)
 

hudrone

Новичок
Автор оригинала: Socrat
ИМХО - по букварю ;):

1 таблица: Goods
2 таблица: Params_name
3 таблица: Params_Value содержит: Goods_id, Params_name_id, params_value

И Все - схема класическая и в комментариях не нуждается(по моему)
Помойму это тежи яйца (вид с боку). Этот вариант просто "приведенние" чем мой, но проблему он не решает.

Попробуем написать запросик:

PHP:
 SELECT *FROM Params_Value WHERE Params_name_id=1 AND params_value=45
Для одного параметра все работает, а если добавить еше?...

PHP:
 SELECT *FROM Params_Value WHERE (Params_name_id=1 AND params_value=45) AND (Params_name_id=2 AND params_value=11)
... то тут уже полный бред написан...

Поэтому очень бы хотелось услышать комментарии... если не сложно. Я в них нуждаюсь.
 

kirill538

Новичок
Вы нуждаетесь не в комментариях, а во внимательном чтении про LEFT JOIN
 

Socrat

Новичок
Вопрос -
Посоветуйте структуру БД
ответ по структуре -
1 таблица: Goods
2 таблица: Params_name
3 таблица: Params_Value содержит: Goods_id, Params_name_id, params_value
Эта структура весьма удобна и масштабируема!!!


SELECT *FROM Params_Value WHERE (Params_name_id=1 AND params_value=45) AND (Params_name_id=2 AND params_value=11)
Да здесь написан БРЕД.
Учитесь работать с несколькими таблицами(не обязательно LEFT JOIN можно и просто перемножением - все зависит от цели)
 

hudrone

Новичок
Про LEFT JOIN читал, возможно недостаточно внимательно...
Но честно говоря не вижу как его здесь можно применить, кроме выборки из таблицы Goods.

Вроде задача тревиальная, а простых путей ее решения я не вижу :( помогите мудрым советом (а не указанием на мою невнимательность).

Большое спасибо.
 

mars37

Новичок
Структуру "правильную" посоветовали, я сам бы так сделал... Но я не совсем понял что нужно Вам вытащить запросом?

Просто информация о товаре, всех его характеристиках со значениями:
select <что нужно>
from Goods g, Params_name n, Params_Value v
where g.Goods_id=<идентификатор нужного товара> and g.Goods_id=v.Goods_id and v.Params_name_id=n.Params_name_id

Если надо по всем товарам, просто уберите g.Goods_id=<идентификатор нужного товара>

Если что-то ещё, спрашивайте ;-)
 

hudrone

Новичок
mars37

На самом деле, заапросом мне надо вытащить список товаров, параметры которого удовлетворяют некоторому условию, т.е. организовать поиск по параметрам. Если в поиске учавствует более одного параметра, то возникает сложность с реализацией запроса.

Чисто теоретически я себе представляю это так:
Небходимо найти пересечение по Id_товара n выборок (каждая выборка - запрос к Params_Value с условием name=x, value=y).

Как это риализовать на SQL для MySQL 4.1.23 я не знаю :(
На край буду создавать n временных таблиц и выбирать уже из них... :(((
 

mars37

Новичок
параметры которого удовлетворяют некоторому условию, т.е. организовать поиск по параметрам. Если в поиске учавствует более одного параметра, то возникает сложность с реализацией запроса.
select <что нужно>
from Goods g, Params_name n, Params_Value v
where g.Goods_id=v.Goods_id and v.Params_name_id=n.Params_name_id and
(
(n.Params_name="параметр1" and v.params_value=22) or
(n.Params_name="параметр2" and v.params_value=33) or
(n.Params_name="параметр3" and v.params_value>10) or
)

Здесь выборка параметров по именам. Если надо по идентификатору товара, то это ещё проще. Это то что нужно? Или я не так понял?
 

hudrone

Новичок
Этот запрос выдаст все строк у которых хотя бы одно из условий в скобхах верное, а мне необходимо одновременное выполнение всех условий.
 

mars37

Новичок
Ага...
select g.Goods_id,g.Goods_name,count(g.Goods_id)
from Goods g, Params_name n, Params_Value v
where g.Goods_id=v.Goods_id and v.Params_name_id=n.Params_name_id and
(
(n.Params_name="параметр1" and v.params_value=22) or
(n.Params_name="параметр2" and v.params_value=33) or
(n.Params_name="параметр3" and v.params_value>10) or
)
group by g.Goods_id,g.Goods_name
having count(g.Goods_id)=3 /*3-число параметров*/

В этом запросе происходит выборка идентификатора товара и наименования товара. Можно конечно и по другим полям...
Так пойдёт?
 
Сверху