Mysql создание структуры бд для товаров с разными сущностями

Boris

Новичок
Добрый день!
Создаю бд для товаров с разными сущностями.
Есть таб. 1, где хранятся все товары их uniq_id, название товара, название таблицы с данными описывающими свойства того или иного товара, таблиц таких много, каждая имеет разную структуру данных подходящую только к данному товару.
Есть таб. 2 , к примеру tab_des_prd_tables (таблица с данными описывающими свойства стола), в ней есть разные свойства, допустим количество ножек, раскладываемый стол или нет, и есть материал ножек, материал столешницы и цвет стола.
Вот тут у меня проблема, так как материалов из которых сделана столешница может быть много ровно как и материалов для ножек и цветов тоже больше одного. Данный пример со столом, но как Вы уже поняли может быть и дверь и окно и смеситель, у них тоже множество вариантов материалов и составляющих причем разных для каждого товара и цветов.
Посоветуйте как быть, для каждого товара, к примеру стола, в таб. tab_des_prd_tables сделать поле с материалом для столешницы к примеру msterial_s и в нем через точку с запятой перечислить все материалы столешницы и потом через LIKE искать (в данном случае смущает время на поиск среди огромного количества товаров скажем больше 100 000 , опыта нет в таких проектах поэтому ВАЖЕН ВАШ СОВЕТ) или все таки посоветуете какой-то способ получше как можно придумать и описать выше изложенную ситуацию.
Спасибо за помощь.
P.S. я читал про решения EAV, One table, Flat tables, Документо-ориентированная база данных
пробую своими силами создать велик, не судите за это, просто администрировать б.д. буду сам и копаться в коде тоже сам.
 

С.

Продвинутый новичок
Иной LIKE в одной простой таблице может оказаться быстрее прямого поска по награмождению таблиц. Слишком подробная формализация данных может оказать медвежью услугу. Я не знаю на какую категорию покупателей расчитан ваш магазин, но если брать в качестве примера обычных людей, то я с трудом могу себе представить покупателя, ищущего себе стол по материлу или количеству ножек. Ну может один из ста тысяч. Городить огород ради этого не стоит. Но даже если вы и реализовали такую возможность, то незачем ее идеально оптимизировать. Пусть ищет хоть минуту. (от ДДОСа только зашититься).
 

Boris

Новичок
Спасибо за ответ. Но не скажите. Есть моменты поиска, которых не хватает на нынешних сайтах, хотя может пример со столом и не очень наглядный. Рассмотрит пример цвета стола. Вы купили кухню бежевого с коричневым цветом, и теперь ищите такой же стол, в большинстве случаев в поиске вам выдадут все столы и на 10 странице вам уже надоест смотреть на бело голубые или темно бордовые столы в современном стиле причем из пластика, хотя вам нужен классический стол из дерева, согласитесь, конечно мой пример требует больших затрат, но в итоге клиенту удобнее.
 

С.

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

Boris

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

С.

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

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

Boris

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

AnrDaemon

Продвинутый новичок
Не надо трахать мозг ни себе, ни нам, ни заказчику.
Если вам нужен удобный доступ к дополнительным свойствам товара - храните их как JSON, например.
А попытаться предугадать погоду на Марсе - вам за это не платят.
 

Boris

Новичок
Спасибо.
Подскажите если я останавливаюсь на eav и немного меняю таблицу описаний товаров:
  • Id_product Mat_base mat_legs Mat_Handle
И к примеру в этой таблице товар стул-001 имеет в первой строчке Mat_base значение 1(дерево) во второй строчке Mat_base значение 34(кожа) и в третьей строчке mat_legs имеет значение 22(металл)
Что говорит о том стул сделан из дерева и кожи с металическими ножками
Скажите как тогда делать запрос если посетитель ищет стулья из дерева с металическими ножками ?
 

С.

Продвинутый новичок
Это не EAV. EAV будет выглядеть так:
  • Id_product Element Material
 

Boris

Новичок
С., я же написал ЕСЛИ я возьму модель EAV и изменю .... То тогда как......
 

WMix

герр M:)ller
Партнер клуба
PHP:
where Material in (...) group by Id_product having count(*) = {count of materials}
 

Boris

Новичок
Т.е. Таблица состоит только из двух полей Id и material
Ищем в material все материалы которые есть у товара групируя по id с селекцией по группе.....
Объясните подробнее пожалуйста, на примере стула-001 как этот запрос выглядет
 

AnrDaemon

Продвинутый новичок
1. Из трёх.
2. Прямо так и выглядит, как вы написали. Только без групп и селекций.
 

Boris

Новичок
ну как же!?
господа, мне нужно решить задачу материалов товаров, если говорить в общем, что например стул сделан из дерева,кожи и метала то тогда таблица состоит из двух полей ид товара и мат товара.
мне же надо разбить стул на составляющие, допустим корпус и ножки, и когда пользователь выбирает ножки - метал, а корпус - дерево, то он получает наш стул-001
я придумал добавить в таблицу поля материалов составляющих тот или иной товар
WMix, where Material in (...) group by Id_product having count(*) = {count of materials}
подсказал как делать запрос
я не врубился если честно и прошу на примере моего стуоа-001 написать запрос
помогите пожалуйста
 

AnrDaemon

Продвинутый новичок
ИЗ ТРЁХ [censored] ПОЛЕЙ!
У стула ножки деревянные, рама стальная а сиденье обтянуто кожей!
http://en.wikipedia.org/wiki/Entity–attribute–value_model
Читать пока глаза не повываливаются.

Завязываем материться, c0dex
 
Последнее редактирование модератором:

AnrDaemon

Продвинутый новичок
А запрос так и будет выглядеть
Код:
ВЫБРАТЬ всё ИЗ таблицы ГДЕ ид = стул-001 И (материал = деревянный ИЛИ материал = железный)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Товарищи, давайте без мата, ога?
 

AnrDaemon

Продвинутый новичок
Boris, если тебе надо именно стул из дерева с ножками из металла, в твоём варианте таблицы ты этого никак получить не сможешь. Побейся головой об стенку.
Когда мусор вытряхнешь, иди почитай основы структурного языка запросов. На самом деле там даже читать нечего - это просто обычный английский язык. Только чуть более жёстко структурированный.
 
Сверху