问题背景:
按照分类存取产品,并且产品分类可变更,要求可以根据分类检索到相应产品,当遇到多维度分类时不易于实现,具体如下:
分类信息如下:
******** 第1级(总分类)***** 第2级(服务项目) *****第3级(分类方式)***** 第4级 ******************************************
-----------汽车美容
-------------------------------------洗车
-------------------------------------------------------------------洗车方式
----------------------------------------------------------------------------------------------人工洗车
----------------------------------------------------------------------------------------------自动洗车
-------------------------------------------------------------------价格区间
----------------------------------------------------------------------------------------------0-30
----------------------------------------------------------------------------------------------31-50
----------------------------------------------------------------------------------------------51-70
----------------------------------------------------------------------------------------------71以上
-------------------------------------------------------------------(其他)
-------------------------------------打蜡
-------------------------------------------------------------------品牌
----------------------------------------------------------------------------------------------3M
----------------------------------------------------------------------------------------------龟牌
----------------------------------------------------------------------------------------------(其他)
-------------------------------------------------------------------价格区间
----------------------------------------------------------------------------------------------0-50
----------------------------------------------------------------------------------------------51-100
----------------------------------------------------------------------------------------------101-150
----------------------------------------------------------------------------------------------151-200
----------------------------------------------------------------------------------------------151以上
-------------------------------------------------------------------(其他)
-------------------------------------(其他)
-----------汽车装饰
---------------------------------玻璃贴膜
---------------------------------底盘装甲
-----------(其他)
**********************************************************************************************************
要求可以按“查询所有”,“服务项目=洗车”, “服务项目=洗车 & 洗车方式=人工洗车”, “服务项目=洗车 & 洗车方式=人工洗车 & 价格区间=0-50” 等查找对应产品服务
难点在于如何查询按方式 “服务项目=洗车 & 洗车方式=人工洗车”,“服务项目=洗车 & 洗车方式=人工洗车 & 价格区间=0-50” 等这样的复合条件检索,因为第二级分类之后,分类维度变高,不易于检索
我的解决方案是:
分类表GoodsClassify:
这样运用静态链表可以存取分类结构
商品表Goods:
其中classify1st可以按总分类属性查询对应商品
其中classify2nd可以按服务项目属性查询对应商品【为了加快查询速度,可以在(classify1st,classify2nd)上建立复合索引】
这样可以存放商品主要信息,但那些多维度分类信息就不好存了
思路:
为了解决前面所提出的“难点”
我为每个服务项目(第2级分类)建立独立的分类索引表,考虑到服务项目的不确定性,我用触发器建完成这份工作,
也就是
1. 当我在“汽车美容”(第1级分类)下添加“洗车”(第2级分类)时,用建立在表GoodsClassify上的促发器创建一个新表(表名为“洗车”),
2. 当我再向“洗车”(第2级分类)下添加“洗车方式”(分类方式)时,用建立在表GoodsClassify上的促发器在名为“洗车”的表中添加新列(列名为“洗车方式”),
类似,向“洗车”(第2级分类)下添加“价格区间”(分类方式)时,用建立在表GoodsClassify上的促发器在名为“洗车”的表中添加新列(列名为“价格区间”),
如此类推......
3.当我向“洗车方式”(第3级分类)下添加“人工洗车”
******我们的促发器是这样的
if (object_id('tgr_Classify_insert', 'tr') is not null)
drop trigger tgr_Classify_insert
go
create trigger tgr_Classify_insert
on GoodsClassify
after insert
as
declare @lvl int
select @lvl=lvl from inserted --获取分类级别
if(@lvl=2) --如果添加第二级分类
begin
declare @classify2 nvarchar(10);
select @classify2=(select classify from inserted)
--创建第二级分类对应的商品表
IF not EXISTS (SELECT name FROM sysobjects WHERE name =@classify2 AND type = 'U')
begin
declare @createtable nvarchar(100)
set @createtable='create table ' + @classify2 + '(id int PRIMARY KEY, goodsId int)'
exec(@createtable)
end
--创建结束
end
if(@lvl=3) --如果添加第三级分类 此级存放商品分类规则
begin
declare @classify3 nvarchar(10), @parent nvarchar(10);
select @classify3 = classify , @parent = parent from inserted
If not exists (select * from syscolumns where id=object_id(@parent ) and name=@classify3)
begin
declare @addColumn nvarchar(100)
set @addColumn='alter table ['+@parent +'] add '+@classify3+' nvarchar(10) null'
print @addColumn
exec(@addColumn)
end
end
go
现在进行如下几部测试看下效果:
1. 执行:
insert into goodsclassify(classify, lvl, parent)
values('洗车',2,'汽车美容')
2. 执行:
insert into goodsclassify(classify, lvl, parent)
values('洗车方式',3,'洗车')
结果:
执行:
insert into goodsclassify(classify, lvl, parent)
values('价格区间',3,'洗车')
结果:
3.将第4级分类插入goodsclassify表中
insert into goodsclassify(classify, lvl, parent)
values('人工洗车',4,'洗车方式')
insert into goodsclassify(classify, lvl, parent)
values('自动洗车',4,'洗车方式')
.........
说明:
这样就解决了不同的服务项目具有不同的分类方式,并且这种分类方式的数目不确定这一问题
解决存:
添加一项产品时,将基本信息存放在Goods表中,
将第二级分类之后的分类信息存放在对应的服务项目分类表中,用goodsId建立了关系
解决取:
按照条件 :“查询所有” 可以直接在Goods表中检索
按照条件 :服务项目=“洗车” 可以直接在Goods表中检索
按照条件 : 服务项目=“洗车” & 洗车方式=“人工洗车” ” 可以在洗车表里检索
按照条件 : 服务项目=“洗车” & 洗车方式=“人工洗车” & 其他属性=“某某某” 可以在洗车表里检索
备注,为了加快检索速度,可以在某些列上建立索引