SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.06.2014 16:25:30

alexbobrow
Участник
Зарегистрирован: 30.06.2014
Сообщений: 4

Структура БД интернет-магазина, помогите советом

Добрый день!

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

Например, сайдбар выглядит подобным образом:  (Галочками пользователь выбирает какие товары он хочет видеть.)

Стоиомсть:
[--[]---------[]-----]  (ползунок)
5000-50000

Бренд:
[  ] Sony
[v] Panasonic
[v] Samsung
[  ] LG

Диагональ:
[  ] 24 дюйма
[v] 32 дюйма
[v] 40 дюймов
[  ] 46 дюймов

Наличие HDMI:
[  ] нет
[v] 2 порта
[  ] 4 порта

У каждого товара можно забить произвольный состав характеристик, к тому же характеристики в каждой категории товара разные, поэтому привязать жестко характеристики к таблице товаров нельзя. Я сделал такую структуру БД:

product
id
name
description
price
category_id

char
id
product_id
char_name_id
char_value_id

char_name
id
name

char_value
id
char_name_id
value

category
id
name

И предполагаю использовать такой запрос для выборки по фильтрам: (где тильды будет соответствующий ID)

select * from product where id in (
    select product_id from char WHERE
    (char_name_id = ~Бренд~ and (
        char_value_id = ~Panasonic~ or
        char_value_id = ~Samsung~ )
    ) or
    (char_name_id = ~Диагональ~ and (
        char_value_id = ~32 дюйма~ or
        char_value_id = ~40 дюймов~ )
    ) or
    (char_name_id = ~Наличие HDMI~ and (
        char_value_id = ~2 порта~)
    )
    group by product_id
    having count(*) = 3
) and
category_id = ~Телевизоры~ and
price > 5000 and
price < 50000


Помогите, пожалуйста: правильные ли структура БД и запрос. Оптимально ли это? Хотя давно занимаюсь веб-разработкой, с более-менее сложными запросами раньше не сталкивался и вопросов на форумах никогда ещё не задавал, поэтому простите, если что не так.

Заранее больше спасибо за уделенное время!

Неактивен

 

#2 30.06.2014 17:28:52

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Структура БД интернет-магазина, помогите советом

Вообще интернет-магазины (в том числе такие крутые как магента) пишутся с использованием парадигмы eav (entity-attribute-value), подумайте в этом направлении. В Вашем случае, думаю, она и нужна.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 01.07.2014 08:45:43

alexbobrow
Участник
Зарегистрирован: 30.06.2014
Сообщений: 4

Re: Структура БД интернет-магазина, помогите советом

Что-то в основном негатив пишут про EAV. А по сути нормальных подробных статей (что это такое и с чем его едят) по EAV я не нашел. Магента вроде как сильно пожалела что использовала EAV и в новых версиях отказалась от её использования. Видел вопросы подобно моему, именно про хранение произвольных характеристик товара в интернет магазине — но что-то все сильно усложняют, и я не пойму что я делаю не так.

Неактивен

 

#4 01.07.2014 09:19:22

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Структура БД интернет-магазина, помогите советом

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

Почитайте шестую главу в "Программирование баз данных SQL. Типичные ошибки и их устранение", там описываются альтернативные методы.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.07.2014 12:08:21

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Структура БД интернет-магазина, помогите советом

alexbobrow написал:

Магента вроде как сильно пожалела что использовала EAV

Неудивительно. Насколько я понял, принцип, лежащий в основе EAV, идеален с точки зрения абстрактной логики подхода (неограниченная гибкость), но структура БД получается тяжелой - отдельная таблица с характеристиками со всеми вытекающими последствиями.

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

Неактивен

 

#6 01.07.2014 14:02:03

alexbobrow
Участник
Зарегистрирован: 30.06.2014
Сообщений: 4

Re: Структура БД интернет-магазина, помогите советом

LazY написал:

Альтернатива тут - делать под каждый реальный вид товара свою таблицу

Вот так все и пишут. Либо EAV, либо под каждый тип товара свою таблицу — вот я и не пойму что не так с тем способом который я описал? Вроде и не EAV и не отдельные таблицы, в то же время структура простая, запросы не такие уж сложные, должно работать все быстро.

Прошу оценить предложенный способ и поправить если что не так. Или объяснить почему, если вариант плохой. Спасибо.

Неактивен

 

#7 01.07.2014 15:58:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Структура БД интернет-магазина, помогите советом

То, что вы предлагаете и есть реализация EAV (в частично нормализованном виде). Возьмем таблицу char:
id
product_id
char_name_id
char_value_id

id в ней не нужно (с точки зрения запросов точно), поэтому его опустим. Оставшиеся три элемента product_id, char_name_id, char_value_id - это ровно entity, attribute, value. То, что используются только id - следствие нормализации БД, к концепции хранения это не имеет отношения.

Думаю, что много путаницы из-за использования штампов для обозначения базовых понятий (как в данном случае EAV для частного случая реляционной модели БД). Потом к аббревиатуре привязывается "хорошо" или "плохо", хотя речь всего лишь о некотором классе решений определенной задачи.

Неактивен

 

#8 02.07.2014 17:54:59

alexbobrow
Участник
Зарегистрирован: 30.06.2014
Сообщений: 4

Re: Структура БД интернет-магазина, помогите советом

Всем спасибо за ответы. Отдельное rgbeast!

Неактивен

 

#9 10.12.2015 08:14:49

maestra
Участник
Зарегистрирован: 10.12.2015
Сообщений: 2

Re: Структура БД интернет-магазина, помогите советом

Вы пишете какой-то фильтр товаров для ЦМС или свою собственную ЦМС интернет-магазинов?

Неактивен

 

#10 17.06.2016 08:52:31

Petval
Участник
Зарегистрирован: 17.06.2016
Сообщений: 3

Re: Структура БД интернет-магазина, помогите советом

alexbobrow написал:

Что-то в основном негатив пишут про EAV. А по сути нормальных подробных статей (что это такое и с чем его едят) по EAV я не нашел. Магента вроде как сильно пожалела что использовала EAV и в новых версиях отказалась от её использования. Видел вопросы подобно моему, именно про хранение произвольных характеристик товара в интернет магазине — но что-то все сильно усложняют, и я не пойму что я делаю не так.

В магазине при большом ассортименте товаров могут быть тысячи характеристик товаров. Как их можно хранить по другому, кроме как EAV?

Неактивен

 

#11 19.06.2016 16:54:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Структура БД интернет-магазина, помогите советом

AFAIK магента в новых версиях перешла с еав на flat-tables, то есть у каждого товара своя табличка. Видать, тоже неспроста.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson