Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
У меня есть две таблицы: таблица товаров и таблица товары_свойства
products
+---+--------+
| id | name |
+---+--------+
| 1 | Товар1 |
+---+--------+
| 2 | Товар2 |
+---+--------+
| 3 | Товар3 |
+---+--------+
| 4 | Товар4 |
+---+--------+
properties_products
id_property=1 - Класс ламината
id_property=2 - Порода дерева
+------------+------------+-------+
| id_property | id_product | value |
+------------+------------+-------+
| 1 | 1 | 33 |
+------------+------------+-------+
| 1 | 2 | 33 |
+------------+------------+-------+
| 1 | 3 | 32 |
+------------+------------+-------+
| 1 | 4 | 33 |
+------------+------------+-------+
| 2 | 1 | Дуб |
+------------+------------+-------+
| 2 | 2 | Бук |
+------------+------------+-------+
| 2 | 4 | Дуб |
+------------+------------+-------+
Допустим, я хочу выбрать весь ламинат 33 класса породы Дуб (1 и 4 товар). Как должен примерно выглядеть такой запрос?
Неактивен
SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`= 'Дуб';
Оно? Как учесть 33 я не очень понял.
Неактивен
Ну в том-то и дело, что данный запрос выбирает товары только по одному свойству. А как выбрать товары сразу по нескольким?
Такой ведь запрос уже не сработает:
Отредактированно Имя занято (25.02.2013 21:13:47)
Неактивен
Такой конечно нет, но можно же так:
SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`= 'Дуб' OR pp.`value`= '33';
или
SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`IN ('Дуб','33');
Неактивен
Но такие запросы вернут и ламинат 32 класса Дуб, и любой цвет 33 класса. Т. е. это получился оператор "или", а не "и".
Каким образом нужно тогда построить базу данных, чтобы возможно было искать товары сразу по нескольким свойствам?
http://www.interparket.ru/laminat/
или http://www.fcenter.ru/products.shtml?es … :30:r:2:1:
Неактивен
Видимо, нужно это после value разбить на два разных поля - в одном из них указывать класс, во втором материал. Ну и в этом случае в запросе учитывайте значения обоих полей в условии WHERE.
Неактивен
А если таких свойств, скажем, 5? Т. е. приходим к структуре, когда все свойства, по которым нужно делать выборку, должны быть столбцами в таблице товаров?
Неактивен
приходим к структуре, когда все свойства, по которым нужно делать выборку, должны быть столбцами в таблице товаров?
А что в этом плохого?
Неактивен
Ну ведь в каждой категории лежат разные товары с разными свойствами. Например, ламинат бывает 32 и 33 класса, а у паркетной доски такого свойства нет. А есть ещё плинтуса и клей, у которых вообще мало общего с ламинатом и паркетом. В итоге в базе будет много пустых ячеек.
Или для примера возьмем магазин электроники. У мобильных телефонов одни свойства, у телевизоров - другие, и т.д. Не всё же это в одну таблицу добавлять? Тогда либо для каждой категории своя таблица с товарами, либо одна таблица с товарами + дополнительная таблица со свойствами.
Неактивен
Я, кстати, нагуглил рабочий вариант для своих таблиц:
Неактивен
Если вернуться к вопросу про то, как хранить товары, у которых куча разных аттрибутов, то для этого используется EAV.
Есть еще мнение, что NoSQL хорошо подходит для таких вещей.
Посмотрите еще
http://sqlinfo.ru/forum/viewtopic.php?id=3034
и
http://sqlinfo.ru/forum/viewtopic.php?id=1536
Неактивен