商品库存SKU

一种解决方案(性能垃圾,基本实现功能)

商品表  属性集表 属性表 属性值表 SKU表 SKU选项表  属性集和属性之间的中间表
表关系
商品表  *--------------1  属性集表
属性集表 *------------------* 属性表
属性表 1 --------------* 属性值表
商品表  1----------------* SKU
SKU 1-------* SKU选项{理解成多对多,会麻烦;需要把所有的可能组合写到选项中之后创建中间表}

商品表

CREATE TABLE Products
(

[ID] [int] IDENTITY(1,1) NOT NULL,--主键

[Name] [nvarchar](50) NOT NULL,--名称

[Describe] [nvarchar](max) NULL,--描述

[PropertiesSetID] [int] NOT NULL--属性集id

属性集合表(属性的组合,便于选择属性并选择属性对应的值)

CREATE TABLE PropertiesSet
(

[ID] [int] IDENTITY(1,1) NOT NULL,--主键

[Describe] [nvarchar](max) NULL--描述

属性表

CREATE TABLE Property
(

[ID] [int] IDENTITY(1,1) NOT NULL,

[Name] [nvarchar](50) NOT NULL,

[Describe] [nvarchar](max) NULL

属性值表

CREATE TABLE PropertyValue
(

[ID] [int] IDENTITY(1,1) NOT NULL,

[Value] [nvarchar](50) NOT NULL,

[PropertyID] [int] NOT NULL,

属性集和属性中间表

CREATE TABLE SetBtProperty
(

[SetBtPropertiesID] [int] IDENTITY(1,1) NOT NULL,

[SetID] [int] NOT NULL,

[PropertyID] [int] NOT NULL,

SKU表

CREATE TABLE  SKU
(

[SKUID] [nvarchar](128) NOT NULL,

[Price] [money] NOT NULL,

[Number] [int] NOT NULL,

[ProductID] [int] NOT NULL,

SKU选项表

CREATE TABLE  SKUOptions
(

[SKUID] [nvarchar](128) NOT NULL,

[ID] [int] IDENTITY(1,1) NOT NULL,

[PropertyID] [int] NOT NULL,

[PropertyValueID] [int] NOT NULL

商家添加商品
商家会填入一些信息
商品名称,再通过 属性集合来便捷选择该商品需要的属性 ,商家选择各个属性对应的值
传递给sqlserver添加商品

商家可以添加属性集合

create procedure [dbo].[sp_CreatePropertySet]

(

@PropertyIDS nvarchar(512),--属性的参数集合 通过 ID;ID的方式进行拼接的字符串

@SetDescribe nvarchar(512)--描述要创建的 属性集合

)

as

begin--这里这样可能没有直接 插入库简便,为了练习 表变量和遍历

insert into PropertiesSet (Describe) values (@SetDescribe) --添加属性集 PropertySet

declare @setID int ; set @[email protected]@IDENTITY--表示刚插入的集合的id

--sqlserver中没有集合List的概念,但是有些时候需要用到 类似于【集合,数组】的功能,比如这个@PropertyIDS,通过 ID;ID的方式进行拼接的字符串 需要进行 ;切割获取到 每个属性的ID,之后在需要的地方还需要取出来使用  在c#中能够使用List;sqlserver中可以通过【表变量】来实现集合和数组的功能

--截取属性集字符串放入【“数组”】

declare @StorePropertyIDS table --声明存储 PropertyID的表变量

(

id int,--模拟数组集合的索引 0 1 2。。。

PropertyID int--值

)

declare @conditionNum int

set @conditionNum=-1

while(@conditionNum<>0)--charindex得不到就返回0,不同于c#返回-1

begin

declare @location int

set @location = charindex(‘;‘,@PropertyIDS)--存储;出现的位置 12;123;23568

if(@location<=1)

begin

declare @str nvarchar(512) = substring(@PropertyIDS,1,len(@PropertyIDS))

insert into @StorePropertyIDS (id,PropertyID) values (@conditionNum+1,cast(@str as int))

set @PropertyIDS= substring(@PropertyIDS,@location+1,len(@PropertyIDS)[email protected])--重新赋值 ids组合字符串

end

else--》1

begin

declare @str2 nvarchar(512)=SUBSTRING(@PropertyIDS,1,@location-1)

insert into @StorePropertyIDS (id,PropertyID) values (@conditionNum+1,cast(@str2 as int))

set @PropertyIDS= substring(@PropertyIDS,@location+1,len(@PropertyIDS)[email protected])--重新赋值 ids组合字符串

end

set @conditionNum = @location--while的条件使用,当charindex没有的时候不不需要再循环了

--遍历表变量插入 中间表

--sqlserver中遍历一个表的方法

declare @id int;declare @ProID int;declare @nec bit;

while exists(select id from @StorePropertyIDS)

begin

set rowcount 1

select @id = id,@ProID=PropertyID from @StorePropertyIDS

set rowcount 0

delete from @StorePropertyIDS where id = @id

insert into SetBtProperty (SetID,PropertyID) values(@setID,@ProID)

end

end

end

开始添加商品

create procedure [dbo].[sp_AddProduct]

(

@num int,--数量

@price money,--价格

@productID int,--商品id

@setID int,--属性集合id

@options nvarchar(612),--属性;值得组合, 如 颜色id#对应的值id;想好id#对应的值id

@name nvarchar(168),--商品名称

@describe nvarchar(614)--商品描述

)

as

begin--{

declare @pidExists int;

select @pidExists = count(1) from Products where [email protected]

if(@pidExists=0)--不存在

begin

insert into Products(Name,Describe,PropertiesSetID) values (@name,@describe,@setID)

set @productID = @@IDENTITY

end

declare @pv table(id int identity(1,1),propID int,pvalue int)--声明表变量,把截取得到的属性编号和值编号存起来,类似于代码中的集合的作用List

declare @pv2 table(id int identity(1,1),propID int,pvalue int)--由于遍历一次要删掉,要用2次就声明了两个

declare @tb table(id int identity(1,1),skuid nvarchar(128))

--获取属性值得组合,属性的个数等在代码中进行控制  [1#1;2#5;13#23]

declare @whileNum int=-1

--截取@options插入到表变量@pv

while (@whileNum<>0)

begin--{

declare @kv nvarchar(128) --存储截取后的前部分的字符串

declare @location int = charindex(N‘;‘,@options)--表示;在options中的位置,sqlserver中的位置是从1开始计算的

if(@location=0)--没有了;

begin--{

set @kv =  substring(@options,1,len(@options))

insert into @pv(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv表变量

insert into @pv2(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv2表变量

end--}

else--能够截取到;

begin--{

set @kv = substring(@options,1,@location-1)

insert into @pv(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv表变量

insert into @pv2(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv2表变量

set @options = SUBSTRING(@options,@location+1,len(@options)[email protected]);--重新个options赋值

end--}

set @whileNum = @location --当没有;时候charindex()返回0

end--}

declare @sqlStr nvarchar(1000)=‘‘--用来根据id+属性+值获取sku信息的语句

--根据商品id+属性+属性值 来获取skuid,是否存在,存在则修改;不存则添加新的skuid

declare @id int;declare @propID int;declare @pvalue int

while exists(select id from @pv)--遍历白表变量

begin--{

set rowcount 1

select @id=id,@propID=propid,@pvalue=pvalue from @pv

set rowcount 0

delete from @pv where id = @id

set @sqlStr [email protected]+ N‘select skuid from SKUOptions where PropertyID =‘+cast(@propID as nvarchar(32))+N‘ and PropertyValueID =‘+cast(@pvalue as nvarchar(32))+‘ intersect ‘

end--}

set @sqlStr = substring(@sqlStr,1,len(@sqlStr)-10)--把最后的intersect去掉

insert into @tb exec sp_executesql @sqlStr--把sp_executesql得到的结果集插入表变量@tb中

declare @HaveSKUID nvarchar(128);

select @HaveSKUID = skuid from SKU where [email protected] and skuid in (select skuid from @tb)

if(@HaveSKUID is null)--不存在

begin--{

declare @newid nvarchar(128)=NEWID()

insert into SKU (SKUID,Price,Number,ProductID) values (@newid,@price,@num,@productID)--插入sku表

--遍历pv2插入skuoption表

while exists(select id from @pv2)

begin--{

set rowcount 1

select @id=id,@propID=propid,@pvalue=pvalue from @pv2

set rowcount 0

delete from @pv2 where id = @id

insert into SKUOptions(SKUID,PropertyID,PropertyValueID) values(@newid,@propID,@pvalue)--插入skuoption表

end--}

end--}

else--存在

begin--{

update SKU set [email protected] where [email protected]只需要修改数量即可

end--}

end--}

加入购物车,此时 能够得到的参数是 商品id  买家选该商品的属性和值

create proc [dbo].[sp_GetSKUFromPropIdAndProperty]--根据商品id和属性获取sku信息,根据skuid的情况一般的sql就能够满足

(

@productID int,--商品id

@options nvarchar(612)--属性;值得组合, 如 颜色id#对应的值id;想好id#对应的值id

)

as

begin--{

declare @pv table(id int identity(1,1),propID int,pvalue int)--声明表变量,把截取得到的属性编号和值编号存起来,类似于代码中的集合的作用List

declare @tb table(id int identity(1,1),skuid nvarchar(128))--声明表变量,存储sku信息

declare @whileNum int=-1

--截取@options插入到表变量@pv

while (@whileNum<>0)

begin--{

declare @kv nvarchar(128) --存储截取后的前部分的字符串

declare @location int = charindex(N‘;‘,@options)--表示;在options中的位置,sqlserver中的位置是从1开始计算的

if(@location=0)--没有了;

begin--{

set @kv =  substring(@options,1,len(@options))

insert into @pv(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv表变量

end--}

else--能够截取到;

begin--{

set @kv = substring(@options,1,@location-1)

insert into @pv(propID,pvalue) values (cast(SUBSTRING(@kv,1,charindex(N‘#‘,@kv)-1) as int),SUBSTRING(@kv,charindex(N‘#‘,@kv)+1,len(@kv)-charindex(N‘#‘,@kv)))--插入@pv表变量

set @options = SUBSTRING(@options,@location+1,len(@options)[email protected]);--重新个options赋值

end--}

set @whileNum = @location --当没有;时候charindex()返回0

end--}

declare @sqlStr nvarchar(1000)=‘‘--用来根据id+属性+值获取sku信息的语句

--根据商品id+属性+属性值 来获取skuid,是否存在,存在则修改;不存则添加新的skuid

declare @id int;declare @propID int;declare @pvalue int

while exists(select id from @pv)--遍历白表变量

begin--{

set rowcount 1

select @id=id,@propID=propid,@pvalue=pvalue from @pv

set rowcount 0

delete from @pv where id = @id

set @sqlStr [email protected]+ N‘select skuid from SKUOptions where PropertyID =‘+cast(@propID as nvarchar(32))+N‘ and PropertyValueID =‘+cast(@pvalue as nvarchar(32))+‘ intersect ‘

end--}

set @sqlStr = substring(@sqlStr,1,len(@sqlStr)-10)--把最后的intersect去掉

insert into @tb exec sp_executesql @sqlStr--把sp_executesql得到的结果集插入表变量@tb中

select * from SKU where [email protected] and skuid in (select skuid from @tb)

end--}

当然购物车中或者其他地方能够得到skuid,直接通过他查询即可,直接where查询完事..

时间: 2024-12-01 03:23:19

商品库存SKU的相关文章

PHP中Notice: Undefined index: sku in 问题解决方案

这个不是bug,而且warning,当用$_GET[]或$_POST[]时不加isset之类判断的话,就会提示这个错误,Jones建议的解决方案完美解决这个问题: /* * 取代$_GET[]获取值 */ function _get($str) { $val = !empty($_GET[$str]) ? $_GET[$str] : null; return $val; } /* * 取代$_POST[]获取值 */ function _post($str) { $val = !empty($_

B2C电子商务系统研发——商品SKU分析和设计(二)

转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过不少电子商务平台软件,关于SKU的设计各有不同,之所以有这样的区别,是因为面向不同规模的电子商务网站, 存在产品分类复杂度,产品数量级的差异.一种设计方式对于百货式的网站,如京东.淘宝等,也许比较方便,但也许对于一个 专卖服装的小型时尚类网站就不够方便了. 我们先看一下麦包包的 女包:http://

Django model :add a non-nullable field &#39;SKU&#39; to product without a default; we can&#39;t do that

You are trying to add a non-nullable field 'SKU' to product without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit

谈谈我对sku的理解(1)

sku的全称是  Stock Keeping Unit ,顾名思义就是库存保存的一个单元,最早用于沃尔玛这种大超市.现在电商行业这么发达,所有的商品都需要发布和配置库存和价格.这样,在互联网世界,sku也就应运而生.今天说说我在工作中遇到的sku和解决方案.   上面介绍了sku的概念,但还是比较抽象.举个简单的例子,现在我需要卖康师傅方便面, 那么康师傅方便面有很多种味道(列举三个,红烧排骨,香菇炖鸡,海鲜味).除了味道,方便面好像还有一些别的属性,比如分为碗装,袋装,超大碗装. 也许还有一些

求大神 &nbsp; 谁做过类似淘宝的sku商品信息组合

求大神   谁做过类似淘宝的sku商品信息组合

SKU与SPU的区别

1. SKU(Stock Keeping Unit)库存量单元 --- SKU是商品下的一个分类属性(商品下一个颜色或者尺码) 2. SPU(Standard Product Unit)标准化产品单元 --- SPU是一个商品编码 一个SKU可以对应多个SPU,简单的说: SPU就是一个iPhone6s, SKU就是银色iPhone6s.粉色iPhone6s

商品sku处理

简单来说,一个电商类网站,根据平台的不同,商品的属性自然也就不同. 一般情况来说,一个商品 goods_id 对应多个 sku_id ; 设计表时我们会采取这样的方式: 产品表 ---  产品sku表 --- 产品基本属性表(产品属性名称表---产品属性值表) 就目前我所接触到得项目而言:一个商品id既是一个商品的id,也是一组商品(相同属性名称,不同属性值)的主id. 在这个项目中,我所了解到的数据库表结构基本如下: 商品表 goods_id  -- 商品id goods_commondid

在电子商务里,一般会提到这样几个词:商品、单品、SPU、SKU

简单理解一下,SPU是标准化产品单元,区分品种:SKU是库存量单位,区分单品:商品特指与商家有关的商品,可对应多个SKU. 首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时候,iphone就是一个商品了. 商品:淘宝叫item,京东叫product,商品特指与商家有关的商品,每个商品有一个商家编码,每个商品下面有多个颜色,款式,可以有多个SKU. SPU = Standard Product Unit (标准化产品单元),SPU是商品信息聚合

SKU=Stock Keeping Unit(库存量单位)。即库存进出计量的单位,可以是以件,盒,托盘等为单位

SKU=Stock Keeping Unit(库存量单位).即库存进出计量的单位,可以是以件,盒,托盘等为单位.SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法.现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号.单品:对一种商品而言,当其品牌.型号.配置.等级.花色.包装容量.单位.生产日期.保质期.用途.价格.产地等属性与其他商品存在不同时,可称为一个单品.