Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что такое "Группа товаров"?
 
 автор: Владимир55   (11.11.2012 в 21:16)   письмо автору
31.6 Кб
 
 

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

Вероятно, для обеспечения такой возможности, в таблице с описанием товаров должно быть предусмотрено поле "Группа".

Но ведь при создании в группе нет ни одного товара! Как же понимать такую группу, пустую?

Или для групп должна иметься отдельная таблица, содержащая только их названия?
А может быть, не только названия, но и ID входящих в группу товаров?

  Ответить  
 
 автор: cheops   (11.11.2012 в 23:34)   письмо автору
 
   для: Владимир55   (11.11.2012 в 21:16)
 

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

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 11:02)   письмо автору
 
   для: cheops   (11.11.2012 в 23:34)
 

Характеристики товара меняются значительно, по всем параметрам: производитель, артикул, название, количество и цена. Возможно даже произвольное группирование. Например, группа один - сюда сто тысяч. Группа два - сюда двести тысяч любых товаров. Группа три - сюда пятьдесят тысяч.

Как лучще действовать в этом случае?

  Ответить  
 
 автор: Sfinks   (12.11.2012 в 11:24)   письмо автору
 
   для: Владимир55   (12.11.2012 в 11:02)
 

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

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 11:50)   письмо автору
 
   для: Sfinks   (12.11.2012 в 11:24)
 

1. Товар жестко привязан к группе. Соотвественно, group_id включаем в перечень
ALTER TABLE kattov ADD UNIQUE (group_id, producer, artikul, name_tov ); 

Так?

2. А в чем суть group_id ? Что этот параметр в себя включает?

  Ответить  
 
 автор: Sfinks   (12.11.2012 в 12:24)   письмо автору
 
   для: Владимир55   (12.11.2012 в 11:50)
 

> 2. А в чем суть group_id ? Что этот параметр в себя включает?
Создаете таблицу GROUPS. В ней будет название группы и ее ID:
group_id | group_name
---------------------
  1      | холодильники
  2      | телефоны  
  3      | машины    
  4      | трактора

Соответственно, если вы видите в товаре, что у него group_id=3 - знаете, что он относится к группе "машины".

Это самый простой вариант... Без вложенных групп-подгрупп и т.п.
---------------
> Соотвественно, group_id включаем в перечень
При чем тут ADD UNIQUE?

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 18:37)   письмо автору
 
   для: Sfinks   (12.11.2012 в 12:24)
 

> Соотвественно, group_id включаем в перечень
При чем тут ADD UNIQUE?


Я имел в виду, что для каждого товара в таблице товаров потребуется включить в перечень полей group_id. Параметр этот необновляемый, так что в запросе
ALTER TABLE kattov ADD UNIQUE (group_id, producer, artikul, name_tov );  

его надо добавить к producer, artikul, name_tov для последующего использования запроса INSERT . ON DUPLICATE KEY.

Разве не так?

  Ответить  
 
 автор: Sfinks   (12.11.2012 в 19:29)   письмо автору
 
   для: Владимир55   (12.11.2012 в 18:37)
 

Мы ж уже вроде выяснили, что даже для (producer,artikul,name_tov) уже не получается добавить уникальный индекс. А Вы к нему хотите еще что-то прибавить. Тем более не получится.

А если действовать как я предложил в разделе MySQL, т.е. через хеш, то зачем там еще одно поле, если сочетание producer,artikul,name_tov уже уникально? Это ни на что не повлияет.

Мне больше интересно, как вы думаете автоматизировать разделение товаров по группам? Не в ручную же 1,5 млн записей сортировать?

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 19:48)   письмо автору
72 Кб
 
   для: Sfinks   (12.11.2012 в 19:29)
 

как вы думаете автоматизировать разделение товаров по группам?
Этот вопрос пока остается открытым.

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


Мы ж уже вроде выяснили, что даже для (producer,artikul,name_tov) уже не получается добавить уникальный индекс.

Во вложении скриншот PHPMyAdmin. Это нормальная ситуация?

  Ответить  
 
 автор: Sfinks   (12.11.2012 в 22:59)   письмо автору
 
   для: Владимир55   (12.11.2012 в 19:48)
 

Так вам все-таки удалось создать индекс.... Уменьшили размер полей до varchar(X)?

Тем не менее это не отменяет фразы "зачем там еще одно поле, если сочетание producer,artikul,name_tov уже уникально?"

ТАМ - подходит и к уникальному индексу, а не только к хешу. Незачем нагружать индекс еще и group_id.

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 23:22)   письмо автору
 
   для: Sfinks   (12.11.2012 в 22:59)
 

Пришлось отказаться от поля ТЕХТ в пользу varchar.

Незачем нагружать индекс еще и group_id.
Я вот этого не понимаю: чем больше полей включено в индекс, тем он больше и больше размер базы?
Я полагал, что индекс от этого не зависит: хоть одно поле, хоть пять...
Неверно?

  Ответить  
 
 автор: Sfinks   (12.11.2012 в 23:34)   письмо автору
 
   для: Владимир55   (12.11.2012 в 23:22)
 

Нет, чем больше полей - тем больше размер, тем больше нужно оперативки, и тем медленнее будет работа индекса.

  Ответить  
 
 автор: Владимир55   (12.11.2012 в 23:41)   письмо автору
 
   для: Sfinks   (12.11.2012 в 23:34)
 

Чем больше полей вообще в таблице или чем больше полей включно в формирование UNIQUE?

  Ответить  
 
 автор: Sfinks   (13.11.2012 в 00:05)   письмо автору
 
   для: Владимир55   (12.11.2012 в 23:41)
 

В общем-то и там и там. Все влияет в той или иной степени. Но если поле таблицы в данном случае - это неизбежная необходимость, то поле в индексе - это излишнее расточительство.

  Ответить  
 
 автор: Владимир55   (16.11.2012 в 14:25)   письмо автору
 
   для: Sfinks   (13.11.2012 в 00:05)
 

А как реализуется ситуация, когда имеют место вложенные подгруппы?

То есть, помимо товаров в корне каталога, имеется группа товаров. И в этой группе есть товары, но в ней есть еще и подгруппа.

А в подгруппе тоже есть товары, но в ней есть еще и под-подгруппа. И в под-подгруппе есть тоже товары и своя под-под-подгруппа…

  Ответить  
 
 автор: Sfinks   (16.11.2012 в 17:18)   письмо автору
 
   для: Владимир55   (16.11.2012 в 14:25)
 

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

  Ответить  
 
 автор: Владимир55   (17.11.2012 в 18:17)   письмо автору
 
   для: Sfinks   (16.11.2012 в 17:18)
 

сложен и в реализации и в понимании

А какой способ самый простой?

  Ответить  
 
 автор: Sfinks   (17.11.2012 в 19:10)   письмо автору
 
   для: Владимир55   (17.11.2012 в 18:17)
 

Самый простой - таблица групп из 3ех полей:
id | parent_id | name
-----------------------
1  | 0         | подушки
2  | 0         | одеяла
3  | 1         | красные
4  | 1         | зеленые
5  | 2         | искуственные
6  | 2         | натуральные
7  | 5         | халофайбер
8  | 5         | полиэстер
где parent_id - id родительского узла.
Т.е. в этой таблице такое дерево:
-подушки
--красные
--зеленые
-одеяла
--искуственные
---халофайбер
---полиэстер
--натуральные

Проблема тут в том, что структуру такого дерева придется извлекать в рекурсии отдельными запросами. Соответственно, если размер дерева и глубина вложенности могут быть большими, то на каждый просмотр такого дерева может потребоваться сотня, а то и больше запросов к БД. Сами понимаете, что это очень плохо.

  Ответить  
 
 автор: Владимир55   (18.11.2012 в 13:10)   письмо автору
 
   для: Sfinks   (17.11.2012 в 19:10)
 

А если сделать только одну таблицу групп такого вида
<?php

id 
name 
----------------------- 
1  подушки 
2  
подушки/красные 
3  
подушки/зеленые 
4  
одеяла 
5  
одеяла/искусственные 
6  
одеяла/искусственные/халофайбер 
7  
одеяла искусственные/полиэстер 
8  
одеяла/натуральные 


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

Почему так нельзя?

  Ответить  
 
 автор: Sfinks   (18.11.2012 в 22:06)   письмо автору
 
   для: Владимир55   (18.11.2012 в 13:10)
 

Это во-первых денормализация, а во вторых, с такой структурой работать - сервер офигеет.
Представьте, что вам надо найти все товары группы "одеяла".
SELECT * FROM tovar
JOIN group USING( group_id )
WHERE group_name LIKE '%одеяла%'
WHERE по строковому полю, да еще и без индекса, да еще и LIKE.
Получается полнотекстовый поиск при обычной выборке товаров.

Так что "нельзя" - понятие относительное. Смотря что вы в него закладываете. Возможно. Но вот на счет скорости и нагрузки....

  Ответить  
 
 автор: Владимир55   (19.11.2012 в 11:46)   письмо автору
 
   для: Sfinks   (18.11.2012 в 22:06)
 

А если поступить таким образом:

Группе "Одеяла" соответсвует group_id = 4.

Тогда я бы попытался выполнить запрос:
<?php
SELECT 
FROM tovar WHERE group_id 4;

Это не годится?

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

Это плохо?

  Ответить  
 
 автор: Sfinks   (19.11.2012 в 14:52)   письмо автору
 
   для: Владимир55   (19.11.2012 в 11:46)
 

> Группе "Одеяла" соответсвует group_id = 4.
А откуда вы это узнаете?

Полагаю ответ на этот вопрос ниже:
> Если потребуется поиск именно по названию, то я бы предварительно сделал запрос
> к таблице групп, чтобы узнать group_id.
А это при такой структуре и есть полнотекстовый поиск.

Разница лишь в том, что вы мой запрос разделили на 2 запроса.

Кроме того, как у вас в таблице товаров будет храниться номер группы к которой принадлежит товар?
Если просто номер, то например искусственное одеяло из полиэстера будет иметь номер группы 7 и поиск всех одеял по номеру 4 его не выведет.
Т.е. искусственное одеяло из полиэстера должно принадлежать к группам 4, 5 и 7.
Как вы это будете хранить?

  Ответить  
 
 автор: btr   (19.11.2012 в 19:59)   письмо автору
 
   для: Sfinks   (19.11.2012 в 14:52)
 

>> Группе "Одеяла" соответсвует group_id = 4.
>А откуда вы это узнаете?

а почему нельзя эту цифру (4) передавать в запрос вместо слова (одеяла)? т.е. на странице при выборе жестко связать эти две величины?

>Т.е. искусственное одеяло из полиэстера должно принадлежать к группам 4, 5 и 7.
>Как вы это будете хранить?

а если сделать так:
id \\товар
id_vid \\ вид товара (одеяло, подушка)
id_tip \\ материал
id_color \\ цвет

и все это цифры?

  Ответить  
 
 автор: Sfinks   (19.11.2012 в 23:14)   письмо автору
 
   для: btr   (19.11.2012 в 19:59)
 

Лично я ниче не понял.

  Ответить  
 
 автор: btr   (19.11.2012 в 23:35)   письмо автору
 
   для: Sfinks   (19.11.2012 в 23:14)
 

дурак не тот кто не понял, а тот кто спрашивать не умеет :(

я имею ввиду - а почему бы в таблице товаров не насоздавать столько столбцов, сколько у них (товаров) характеристик? :\ и значения в полях этих столбцов задавать не словами (подушка) а цифрами? а потом по ним выбирать?

  Ответить  
 
 автор: Sfinks   (19.11.2012 в 23:39)   письмо автору
 
   для: btr   (19.11.2012 в 23:35)
 

И на каждую группу товаров по отдельной таблице "товары"?
Или у мобильных телефонов будут характеристики и от мотокультиваторов и от занавесок?
Вы хорошо представляете себе таблицу с 2000 столбцов?
А если еще учесть что тут речь идет о таблице с 1,5 млн. строк......

  Ответить  
 
 автор: btr   (19.11.2012 в 23:50)   письмо автору
 
   для: Sfinks   (19.11.2012 в 23:39)
 

был неправ, вспылил, прошу дать возможность загладить, искупить. все :)

  Ответить  
 
 автор: Sfinks   (19.11.2012 в 23:57)   письмо автору
 
   для: btr   (19.11.2012 в 23:35)
 

Вообще, вас сбило то, что я не удачную структуру групп товаров привел в качестве примера.
Но на то он и пример. Там можно было написать группа А, подгруппа Б.
Не в этом суть. А в том, что речь не о характеристиках, а именно о группах.
Например такая структура будет понятнее:
-продукты питания
--молочные продукты
---сыры
---молоко
---кефиры
--колбасы
--напитки
---алкогольные
----пиво
----водка
---безалкагольные
----соки
----лимонады
-бытовая химия
--моющие средства
---стиральные порошки
---средства для мытья посуды
--средства личной гигиены
---зубные пасты
---прокладки
-товары для детей
-хозтовары
-сад, огород
и т.д. и т.п.

_____________
З.Ы. Кажись у велосипеда появился второй конструктор =))))))

  Ответить  
 
 автор: Владимир55   (20.11.2012 в 15:05)   письмо автору
 
   для: Sfinks   (19.11.2012 в 23:57)
 

Полагаю, что оптимальное решение зависит от задачи (хотя универсальное подходит всегда).

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

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


Каждая из этих групп вполне может быть изначально связана с соответсвующим group_id.

Предположим, что посетителя заинтересовали продукты питания. Кликнув по этой группе, он увидит группы
--молочные продукты
--колбасы
--напитки


Кликнув на молочные продукты, увидит
сыры
молоко
кефиры


А потом в каждой из них получит перечень товаров, который может быть быстро собран по group_id.

Что я здесь неверно интерпретировал?

  Ответить  
 
 автор: Sfinks   (21.11.2012 в 23:38)   письмо автору
 
   для: Владимир55   (20.11.2012 в 15:05)
 

Вы о реалистичном примере, или о программной реализации?

Если из реальности, то возможно входя в магазин и так. А вот до магазина, человек с конца начинает: У меня кончилась крупа, колбаса, туалетная бумага и наполнитель для кошачьего туалета. Также и войдя в магазин со списком он сперва видит товары, а потом начинает соображать в каком углу они находятся.

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

  Ответить  
 
 автор: Владимир55   (22.11.2012 в 11:12)   письмо автору
 
   для: Sfinks   (21.11.2012 в 23:38)
 

Вы о реалистичном примере, или о программной реализации?

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


Я о программной реализации, о показе в Панели управления сайтом.

Когда создается группа, то в таблице формируется group_id и заполняется group_name, а также id родовой группы, к которой относится создаваемая группа. По идее, этих сведений достаточно для любой выборки.

В общем, надо попробовать на макете - любопытно, получится или нет.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования