Привет народ.
При проектирование своего интернет магазина, столкнулся с проблемой.
С формы записываю данные в БД (название, описание, цена). Проблема в том что этим товарам нужен цвет, а у каждого товара будет разное количество цветов и сами цвета, я создал отдельную таблицу цветов, но не знаю четкого количества столбцов(так как не знаю сколько будет цветов у товара), если столбцы прибавлять по средствам ALTER, то буду ячейки с NULL, также хочу связать таблицы цветов и товаров со связью "Многие ко Многим" и получить результат в 3-ий таблице, но опять же все упирается в то что не могу создать четко таблицу, не имея точного количества цветов.
Что предложите делать ?
Заранее Спасибо.
Вопрос номер раз: вам необходима выборка типа "все товары красного цвета"? Если нет, тогда тупо можно пихать массив цветов конкретного товара в одно поле.
Если необходимо, тогда имеем три таблички:
Товар / ТоварИД, ЦветИД/ Цвет
Вообще, "четко" в БД бывает только когда просто, в натуре. А когда сложнее, четкость - ацтой. Приходится думать головой от задачи.
Зуб даю.
Да, и не закладывайте на будущее, если это не в ваших планах.
Если вы торгуете трусами, то первичный фактор: женские, мужские, детские. А только потом цвет. Подход "а вдруг" - гарантированный способ приобретения траблов. Сконвертить одно поле в отношения в данном случае не проблема. Если разбухать базу излишествами - может стать проблемой.
Ivan Soshnikov: точно так же - денормализовать потом не проблема. А EAV хорошо описанный подход который решает все проблемы, хорошо скейлится (в плане функциональности) и в принципе ок.
Опять же для e-commerce если очень переживать какую модель хранения данных использовать - всегда можно вооружиться event sourcing-ом и формировать оптимизированную денормализованную структуру для монги той же. Ну или опять же - каталог хранить в той же монге или эластике.
Лично я в данный момент разрабатываю интернет магазин на Laravel, связи до банальности простые (парочка belongsToMany для опций и категорий соответственно).
Если пишите на чистом PHP / MySQL (это конечно то еще удовольствие), вот вам полученные SQL запросы: