Дизайн и оптимизация функции SKU продукта

Java MySQL
Дизайн и оптимизация функции SKU продукта

Адрес фактического центра электронной коммерции SpringBoot (30k+star):GitHub.com/macro-positive/…

Резюме

В исходном дизайне SKU продукта есть две проблемы: во-первых, дизайн таблицы SKU относительно цельный и не может быть расширен. Другой заключается в том, что при изменении информации о продукте изменится идентификатор SKU продукта.Поскольку и таблица корзины покупок, и таблица продуктов заказа связаны с идентификатором SKU продукта, он не будет совпадать. Недавно были сделаны некоторые оптимизации по этим двум задачам, давайте поговорим об идеях оптимизации.

SPU и SKU продукта

Прежде всего, давайте разберемся с концепцией товарных SPU и SKU.Многие друзья, которые не были в контакте с электронной коммерцией, могут этого не понять.

  • SPU (стандартная единица продукта): относится к стандартной товарной единице, наименьшей единице агрегирования информации о товаре, представляет собой набор многократно используемой и легко извлекаемой стандартизированной информации, которая описывает характеристики товара;
  • SKU (единица хранения запасов): единица хранения запасов, наименьшая единица запасов, которая физически неотделима.

Например: например, есть продукт для мобильных телефонов под названием Xiaomi Mi 8. Xiaomi Mi 8 имеет различные атрибуты, такие как черный и синий, а также версии 32G и 64G. В настоящее время小米8является SPU, и小米8黑色64GПросто артикул.

Дизайн артикула продукта

предыдущий дизайн

Информация о SKU продукта хранится вpms_sku_stockВ таблице три атрибута sp1, sp2 и sp3 используются для хранения атрибутов продаж продукта, которые очень негибкие и трудно расширяемые.

Этот подход также приносит последующие проблемы.Например, наша корзина и заказ должны хранить атрибуты продаж.В этом случае нам нужно будет добавить атрибуты sp1, sp2 и sp3.

улучшенный дизайн

Поскольку атрибуты продаж товаров являются динамическими, невозможно определить, сколько их, в настоящее время мы можем использовать формат JSON для их хранения.pms_sku_stockдобавлено в таблицуsp_dataполе.

sp_dataХранится массив JSON.Например, информация о хранилище мобильного телефона черного цвета и емкости 32G выглядит следующим образом.

[
    {
        "key": "颜色",
        "value": "黑色"
    },
    {
        "key": "容量",
        "value": "32G"
    }
]

После этой модификации в исходной таблице корзиныoms_cart_itemи таблица заказовoms_order_itemВы можете использовать формат JSON для хранения атрибутов продаж вproduct_attrполе.

Модификация SKU, связанных с продуктом

предыдущая практика

Информация о SKU продукта, как связанная информация о продукте, будет изменена одновременно с изменением информации о продукте. Предыдущая практика заключалась в том, чтобы напрямую удалить всю информацию о SKU продукта и добавить ее снова. Это приведет к изменению идентификатора в артикуле продукта.Поскольку идентификатор артикула продукта связан с корзиной и заказным продуктом, исходный идентификатор станет недействительным. Ниже приведен исходный код для изменения информации о SKU в продукте.

/**
 * 商品管理Service实现类
 * Created by macro on 2018/4/26.
 */
@Service
public class PmsProductServiceImpl implements PmsProductService {
    
        @Override
        public int update(Long id, PmsProductParam productParam) {
            //省略若干代码...
            //删除该商品关联的SKU
            PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
            skuStockExample.createCriteria().andProductIdEqualTo(id);
            skuStockMapper.deleteByExample(skuStockExample);
            handleSkuStockCode(productParam.getSkuStockList(),id);
            //插入传入的所有SKU
            relateAndInsertList(skuStockDao, productParam.getSkuStockList(), id);
        }
}

Улучшенная практика

Прежде всего, нам необходимо договориться с интерфейсом о том, что информация о SKU нового продукта не будет передавать идентификатор, информация о SKU продукта, который будет изменен, будет передана идентификатору, а информация об удаленном SKU продукта не будет передана. напрямую. Затем мы можем определить информацию о SKU, которую необходимо добавить, изменить и удалить в соответствии с поступающей информацией о SKU, чтобы при обновлении информации о SKU продукта идентификатор исходного SKU продукта не изменялся Конкретный процесс выглядит следующим образом. .

Конкретный код реализован следующим образом:

/**
 * 商品管理Service实现类
 * Created by macro on 2018/4/26.
 */
@Service
public class PmsProductServiceImpl implements PmsProductService {
    private void handleUpdateSkuStockList(Long id, PmsProductParam productParam) {
        //当前的sku信息
        List<PmsSkuStock> currSkuList = productParam.getSkuStockList();
        //当前没有sku直接删除
        if(CollUtil.isEmpty(currSkuList)){
            PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
            skuStockExample.createCriteria().andProductIdEqualTo(id);
            skuStockMapper.deleteByExample(skuStockExample);
            return;
        }
        //获取初始sku信息
        PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
        skuStockExample.createCriteria().andProductIdEqualTo(id);
        List<PmsSkuStock> oriStuList = skuStockMapper.selectByExample(skuStockExample);
        //获取新增sku信息
        List<PmsSkuStock> insertSkuList = currSkuList.stream().filter(item->item.getId()==null).collect(Collectors.toList());
        //获取需要更新的sku信息
        List<PmsSkuStock> updateSkuList = currSkuList.stream().filter(item->item.getId()!=null).collect(Collectors.toList());
        List<Long> updateSkuIds = updateSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
        //获取需要删除的sku信息
        List<PmsSkuStock> removeSkuList = oriStuList.stream().filter(item-> !updateSkuIds.contains(item.getId())).collect(Collectors.toList());
        handleSkuStockCode(insertSkuList,id);
        handleSkuStockCode(updateSkuList,id);
        //新增sku
        if(CollUtil.isNotEmpty(insertSkuList)){
            relateAndInsertList(skuStockDao, insertSkuList, id);
        }
        //删除sku
        if(CollUtil.isNotEmpty(removeSkuList)){
            List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
            PmsSkuStockExample removeExample = new PmsSkuStockExample();
            removeExample.createCriteria().andIdIn(removeSkuIds);
            skuStockMapper.deleteByExample(removeExample);
        }
        //修改sku
        if(CollUtil.isNotEmpty(updateSkuList)){
            for (PmsSkuStock pmsSkuStock : updateSkuList) {
                skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);
            }
        }

    }
}

Суммировать

Если мы хотим сохранить в базе данных некоторые свойства, которые не имеют фиксированного формата, мы можем сохранить их в виде JSON. Для модификации связанного атрибута можно использовать некоторые логические операции для реализации модификации без изменения исходного идентификатора.

Адрес исходного кода проекта

GitHub.com/macro-positive/…

публика

проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на общедоступный номерПолучите это прямо сейчас.

公众号图片