Все очень опционально.
Если у вы данные в приложение передаете в json, то и храните в json(например, в постгресе хорошая поддержка таких типов полей)
, ключи, как первичные, так и внешние, вынесите в атрибуты таблицы. Этот подход даст большую гибкость в изменении свойств товаров. Я бы начал с него.
Упомянутый
unfilled EAV, например, также даст вам возможность гибко менять/добавлять и удалять свойства товаров на странце. Но для получения результирующего набора данных нужно делать много соединений таблиц. А стоимость запроса зависит от многих факторов(наличие\отсутсвии индекса, объем выбираемых данных, соотношение объема к общему объему таблицы, ...) и от вашего скила.
Не бывает хороших или плохих структур\архитектур,а есть только структуры\архитектуры, которые отвечают или не отвечают текущим требованиям. Все очень сильно зависят от реализации и требований. Тут главное не попасть в "ошибку преждевременной оптимизации".
Любой из подходов чреват гемороями и деградации производительности. Тем более приложение будет меняться со временем.
Любая структура БД покажет себя только в реальных условия и на реальных данных и в нагрузке.