Адрес фактического центра электронной коммерции 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. Для модификации связанного атрибута можно использовать некоторые логические операции для реализации модификации без изменения исходного идентификатора.
Адрес исходного кода проекта
публика
проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на общедоступный номерПолучите это прямо сейчас.