Нет, подход неправильный.
Несколько вопросов, позволяющих натолкнуться на правильную мысль:
1) Что, если товаров несколько миллионов? Будете хранить весь миллион `items` и выдёргивать его каждый раз?
2) Что, если в корзину нужно положить два одинаковых товара?
3) Обычно товар в корзине не имеет все характеристики сразу (`sizes` в вашем случае) сразу, характеризуясь лишь некоторыми свойствами
А ещё в корзинах обычно дофига внутренней бизнес-логики, которую на фронте держать...
Ну, наверное, можно, но практика показывает, что чем сложнее требования бизнеса, тем менее целесообразно это всё делать на фронте.
Всякие "если товаров определённого типа с определённым свойством в корзине более пяти штук, а ещё сегодня пятница и в админке поставлена галочка, то примени к этим товарам скидку в 50%, но не более 10 000 рублей, не суммируя с другими скидками" - это традиционно задача на бэкенд.
Отсюда логичным образом следует, что элементы в корзине не должны (более того - не могут) формироваться напрямую из списка продуктов, это просто другие данные, получаемые из другого источника, с другой схемой.
Схемы (набор полей) могут пересекаться, одна может являться надмножеством другой - короче, они могут быть тем или иным образом похожи, но сущности это разные.