Материально делается так. Эти все "атрибуты" суть справочники с которыми есть 1 простое отношение.
create table Продукт (
Код_продукта int usingned auto_increment primary key,
Наименование varchar(255) not null,
Размер smallint unsigned not null,
Код_цвета int unsigned,
Код_материала int unsigned not null
);
create table Цвет (
Код_цвета int unsigned,
Цвет varchar(64)
);
create table Материал (
Код_материала int unsigned,
Материал varchar(64)
);
Оператор добавляет в таблицу цветов - цветы и дает им название.
Оператор добавляет в таблицу материалов - название материалов.
Реализуем заданные отношения
select * from Продукт
join Цвет using(Код_цвета)
join Материал using(Код_материала)
where Продукт.Наименование ='Футболка мужская';
Заметили что 'Футболка мужская' будет не нормально избыточной?
Потому что продукты должны иметь отношение к, например Ассортимент. Таблице которая такой же справочник. Переделываем под ассортимент
create table Ассортимент (
Код_ассортимента int unsigned auto_increment primary key,
Наименование varchar(255) not null
);
[sql]create table Продукт (
Код_продукта int usingned auto_increment primary key,
Код_ассортимента int unsigned not null,
Размер smallint unsigned,
Код_цвета int unsigned not null,
Код_материала int unsigned not null
);
select * from Продукт
join Ассортимент using(Код_ассортимента)
join Цвет using(Код_цвета)
join Материал using(Код_материала)
where Ассортимент.Наименование ='Футболка мужская';
Все должно быть вот так просто. Потому что цвет и размер и материал не порождают отношений между продуктами (не может желтая футболка каким-то боком относиться к футболке 37-го размера), одновременно цвет, материал и размер не являются "атрибутами" которые можно вставить и вынуть, потому что это неотъемлемые сущности которые создают артикул.
Цвет, материал, фактура, размер - это индивидуальные признаки товара. Которые будучи перечислены подряд создают артикул - артикль - статью - название. Например "Футболка мужская, цвет красный, размер 56, материал хлопок". Но вы запаритесь с составными ключами, я только что проверил - нет сведений о том, чтобы кто-то их юзал. Составной ключ это почти вся таблица Продукт засунутая в
CONSTRAINT pk_Article PRIMARY KEY (Код_ассортимента, Размер, Код_цвета, Код_материала)
Поэтому составные ключи заменяют на обычное число, типа нашего ID:
Артикул int unsigned not null --- более 4 миллионов продуктов вас устроит?
Поле надо проиндексировать key(Артикул)
И только с возникновением потребности связать индивидуальные товары по каким-то надуманным признакам появляются отношения N:N
Может быть артикул тем же самым ID с A_I? Зависит от отношений со складом.
А вот Код_цвета очень даже может быть обычным rgb hex.