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

Форум MySQL

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

 

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

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

тема: Проектирование хранения данных на сайте
 
 автор: mysql_Sergey   (19.06.2015 в 17:01)   письмо автору
 
 

Доброго дня!

Помогите, пожалуйста, разобраться с принципом организации хранения данных для интернет-магазина.

Ситуация состоит в том, что необходимо представлять множество товаров (тысячи), но они все разношерстные. Т.е. например: отвертки (длина, ширина, тип, ...), лампочки (размеры, вес, мощность, тип цоколя, ...), оборудование (размеры, ток, мощность, вес, характеристики рабочей зоны, ...) и т.д.

Раньше просто работал только с малыми каталогами товаров и при этом однотиповых товаров.

Хранение делал так:
Таблица №1: хранил категории и подкатегории товаров
Таблица №2: хранил коды товаров, цены, описания, характеристики. и привязку к категории в таблице №1

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

И непонятный вопрос состоит в том, что при наличии разношерстных товаров, я понимаю, что для разных групп товаров необходимо создавать отдельные таблицы для хранения данных.
Видится так:
Таблица №1: располагается дерево иерархии категорий и подкатегорий.
Таблица №2,3,4,5,6...145 и т.д.: тут планирую расположить коды заказов товаров, описания, характеристики, цены, наличие и прочее. и привязку к категории в таблице №1.

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

Думается, что может быть есть какой нибудь способ перебрать в цикле все имеющиеся таблицы на факт принадлежности товаров к текущей категории? И писать отдельную функцию по перебору всех таблиц базы данных и сопоставления нужной функции вывода на экран - кажется каким-то бредом!

Может быть кто сможет подсказать, как такое правильно организуют? Пожалуйста, пожалуйста, пожалуйста!!!

P.S.: среди характеристик товаров планируется еще и тегирование с показом соответствующих страниц... :(

  Ответить  
 
 автор: Igorek   (19.06.2015 в 17:29)   письмо автору
 
   для: mysql_Sergey   (19.06.2015 в 17:01)
 

Ну а если все характеристики и их значения зашить в две таблицы:

таблица всех характеристик
feature_id | feature_title

таблица связи товара, его характеристики и значения этой характеристики:
product_id | feature_id | feature_value

таким образом можно добавлять сколь угодно много характеристик любому товару. Другое дело, что выборка становится сложнее, например, чтобы выбрать товар у которого цена больше ста и мощность равно 150 придется делать нечто подобное:
<?
select product_id
count(product_idcnt
from product_features where
(feature_id #цена
and feature_value 100
OR
(
feature_id #мощность
and feature_value 150
group by product_id
having cnt 
#выбираем только те продукты, у которых обе характеристики совпали


+ ко всему с индексами беда. Хотя, если скорость критичный момент, можно наиболее часто используемые характеристики сделать "классическим" вариантом - в таблице товаров, каждая характеристика отдельным столбцом, что, правда, опять же добавляет сложности при выборке))

Также, если время позволяет, можно покопать в сторону других БД. Вроде бы графовые базы здесь помогут, может nosql-решения (с хранением таких структур точно проблем не будет, а вот с поиском - не скажу)

В общем, мысли такие. Может кто еще чего предложит.

  Ответить  
 
 автор: mysql_Sergey   (19.06.2015 в 18:26)   письмо автору
 
   для: Igorek   (19.06.2015 в 17:29)
 

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

Но за идею спасибо, огромное!

Может быть еще кто-нибудь идеи расскажет? Есть же хорошие и крупные интернет-магазины, типа www.vseinstrumenti.ru - не уж то ни кто не знает, как у них там структура товаров хранится... :)

  Ответить  
 
 автор: Igorek   (20.06.2015 в 15:04)   письмо автору
 
   для: mysql_Sergey   (19.06.2015 в 18:26)
 

Немного погуглив на эту тему вижу 4 варианта организации БД для магазина, которые мы в общем-то уже упомянули с вами:
1. Одна таблица
Ваш вариант, которым вы раньше пользовались. Все характеристики в одной таблице.
2. Много таблиц
Вариант, который вы предложили - для каждого типа товара своя таблица
3. EAV (Entity–attribute–value)
Вариант, который я предложил. Вроде как magento его использует. Есть улучшения этого подхода, которые позволят увеличить скорость выборки. Если интересно - поиск в помощь, информации тьма в интернетах.
4. Документо-ориентированная база (MongoDB, CouchDB и т.д.)
Отходим от реляционности, которая в данной задаче только палки в колеса ставит и вперед к новому и неизведанному.

Я бы выбрал 4й подход, если есть возможность выбрать не реляционную БД, если нет - то EAV

  Ответить  
 
 автор: mysql_Sergey   (22.06.2015 в 18:21)   письмо автору
 
   для: Igorek   (20.06.2015 в 15:04)
 

Огромное спасибо за инфу. Ща поищу и почитаю про эту модель. По факту за выходные придумал не совсем реляционную базу, т.е. при категории хранить имя таблицы из которой "черпать" изделия. По концепции SQL не совсем правильно, но зато при совокупном использовании еще запросов из PHP получается "бомба".
Но, естественно со всеми вытекающими придется самому полностью контролировать целостность базы данных (избыточность, дубли, несоответствия, и др...)

И все равно спасибки, гляну на неделе по приведенной инфе...

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

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