Ваша таблица Продуктов является шизофреничной, ее сущность иногда является Продуктом, а иногда - Вариантом. Это приводит к очень громоздкому поведению. Например, вам нужен вопрос "сколько у нас разных продуктов?" ответьте select count(*) from products
, но здесь это дает неправильный ответ, чтобы получить правильный ответ, вы должны знать магическое число 0 и запрос select count (*) from products where master=0
. «Перечислите все продукты и сколько у нас вариантов для каждого» - это еще один запрос, который должен быть простым, но сейчас его нет. Существуют и другие аномалии, например, тот факт, что первая строка в products_description - это рубашка с ценой и изображением, но без размера (размер сохраняется в вариантах, но у них есть цены и собственные рисунки).
Ваша проблема звучит так, как будто у вас есть товары в двух контекстах: (1) что-то, что может быть отображено как товар в вашем магазине, и (2) что-то, что может быть заказано вашим клиентом. (1) возможно, у него есть имя типа «Футболка на Хэллоуин» или около того, и у него, вероятно, есть изображение, которое видит клиент. (2) - это то, что заказывает клиент, поэтому он имеет (1), но также и вариант спецификации, такой как «маленький» или, возможно, цвет «красный». Вероятно, у него также есть цена и идентификатор_порядка, чтобы ваш магазин мог знать, какой именно товар необходимо отправить.
Вы должны дать каждому контексту сущность. Вот как бы я это сделал
displayable_product
id name
1 "Baseball Cap"
2 "T-Shirt"
orderable_product
id d_product_id order_id size color price
1 1 123 red 9.99
2 2 456 small 19.99
3 2 789 medium 21.99
displayable_content
id d_product_id locale name image
1 1 en_US "Baseball Cap" baseballcap.jpg
2 1 es_US "Gorra de Beisbol" baseballcap.jpg
3 2 en_US "Nice T-Shirt" nicetshirt.jpg
4 2 es_US "Camiseta" nicetshirt.jpg
Возможно, вам следует использовать locale
вместо country
в таблицах отображения для учета стран с более чем одним языком (США, Швейцария и другие), и вы можете разделить size
и color
на собственный variants
стол. И если вам нужны зависящие от страны данные о заказах (например, разные цены / валюты для доставки в разные страны), вам также придется извлечь зависимую от страны таблицу orderable_content.