|
|
|
|
|
для: Лена
(07.06.2010 в 16:45)
| | нет. никакой серилизации.
В MySQL есть тип SET - я о нем.
Если SETами описывать наборы будет неудобно, тогда делать придется через доп. связующие таблицы | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2010 в 00:10)
| | Спасибо за объяснение.
То есть, я так поняла, если у нас есть характеристика interface, у нее, допустим, три значения, составляем из трех значений массив, сериализуем его, кладем в соответствующую строку в таблице значений - prop_values, привязываем ее соответствующим полем к таблице характеристик - props, и когда нам надо какое-то значение характеристики, мы десериализуем и вытягиваем это значение.
Слишком много работы получается. | |
|
|
|
|
|
|
|
для: Лена
(06.06.2010 в 23:14)
| | В моей классификации предполагалось, что список видов товаров (parts) - линеен. А не древовиден.
В этом случае возможно одни и те же виды товаров помещать в разные категории древовидной структуры.
К примеру, поместить вид товара "внешние кард-ридеры" как в категорию USB-гаджетов, так в категорию аксессуаров для ноутбуков, так и в категорию контроллеров устройств хранения данных.
Кстати список видов товаров можно продублировать кроной основных узлов дерева категорий.
что касается множественных характеристик видов товаров, то типом описываемого значения для них, предполагался набор (SET). Набором /множеством можно описать возможность применения двух, трех, или сколько там надо вариантов интерфейсов у материнской платы, возможность установки процессоров определенных разных производителей, и т.п.
При этом поле min можно применять для хранения множества затребованных элементов набора, а max - для хранения множества исключаемых элементов набора.
Все это (начиная от применения типов SET и далее) несколько коряво, но более стройная схема в те полчаса не придумалась. | |
|
|
|
|
 3 Кб |
|
|
для: Trianon
(06.06.2010 в 11:21)
| | Спасибо. То, что у меня получилось с таблицами - в аттаче, ввела первые тестовые значения.
Не понятны вот какие моменты:
1. Почему нет связи между plu и category. У нас в plu, допустим, Материнка№1, она принадлежит к категории "материнки".
2. Связь между plu и parts - поле part_id, логичнее было бы сделать в parts поле-связку, комплектующее принадлежит к товару, значит в комплектующем должна быть ссылка на товар.
3. Пробовала сделать запрос: выбрать все видеокарты из категории 1(=Видеокарты), где характеристка видеокарты == характеристика материнки с id=1(это у меня Материнка№1).
SELECT * FROM parts p
LEFT JOIN link l ON p.id=l.part_id
LEFT JOIN prop_values pv ON p.id=pv.prod_id
LEFT JOIN props pr ON p.id=pr.id
WHERE l.cat_id=1 AND pv.value = (
SELECT value FROM prop_values
WHERE prod_id=1
)
|
Результат - #1242 - Subquery returns more than 1 row
Что, в принципе, вполне логично. Смотрите в мои таблицы, характеристика видеокарты interface имеет два разных значения в таблице prop_values и если эту характеристику записать товарам с разным prod_id - подзапрос не проходит. | |
|
|
|
|
 27.8 Кб |
|
|
для: Лена
(05.06.2010 в 22:49)
| | прошу прощения за поток сознания - в аттаче | |
|
|
|
|
 78.1 Кб |
|
| Задача поставлена следующая.
Существует таблица категорий.
CREATE TABLE `category` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`name` varchar(30) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
|
Есть таблица продуктов:
CREATE TABLE `product` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`cat_id` bigint(20) unsigned NOT NULL,
`name` text,
`short_text` varchar(400) default NULL,
`full_text` text,
`price` decimal(10,2) default NULL,
`socket` varchar(200) default NULL,
`size` varchar(100) default NULL,
`ram` varchar(100) default NULL,
`interface` varchar(100) default NULL,
`sata` varchar(100) default NULL,
`image` text NOT NULL,
`presense` text NOT NULL,
PRIMARY KEY (`id`),
KEY `cat_id` (`cat_id`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;
|
На странице - название продукта из первой категории.
Под ним - список остальных категорий.
Напротив каждой категории кнопка - Выбрать.
При нажатии на кнопку одна характеристика продукта из первой категории сравнивается с той же характеристикой продуктов из других категорий.
Например. Страница выглядит так:
Материнка №1.
Другие категории:
Кулер кнопка "Выбрать"
Видеокарта кнопка "Выбрать"
Жесткий диск кнопка "Выбрать"
Оптический привод кнопка "Выбрать"
и т.д.
Во второй категории у нас кулеры.
Нам надо сравнить содержимое поля socket у кулеров и у выбранной материнки.
Если совпало - вывести список продуктов из второй категории.
Т.е. запрос к базе будет таким:
$sql = "SELECT * FROM product WHERE cat_id='2' and socket='$socket'";
Где $socket - сокет у материнки.
Далее из этого списка продуктов пользователь может выбрать один - тот, который решил купить.
И результат его выбора нам надо записать в базу. А потом эта информация выводится на страницу, которую я описала выше.
Но теперь напротив названия второй категории - кулеры - нет кнопки "Выбрать", а стоит выбранный продукт. Далее пользователь переходит к третьей категории и выбирает из нее продукт.
Здесь и возникла трудность - какая должна быть таблица, чтобы зафиксировать выбранный продукт.
У меня таблица получилась такая:
CREATE TABLE `constructor` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL,
`id_mat` int(11) NOT NULL,
`cat_2` int(11) NOT NULL,
`cat_3` int(11) NOT NULL,
`cat_4` int(11) NOT NULL,
`cat_5` int(11) NOT NULL,
`cat_6` int(11) NOT NULL,
`cat_7` int(11) NOT NULL,
`cat_8` int(11) NOT NULL,
`cat_9` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=16 ;
|
user_id - пользователь, который выбрал продукт
id_mat - ид материнки, с которой сравнивали
cat_2 - категория, в это поле пишется ид продукта, который выбрали + последняя цифра в названии поля показывает ид категории.
Знаю, что неправильно, но как можно сделать по другому?
И еще одно. Если пользователь выбрал продукт в третьей категории, четвертой и т.д. - строка в базе обновляется, т.е. на картинке показано, что пользователь сделал выбор продукта во 2,3,4 категории. | |
|
|
| |
|