产品分类检索解决方案(基于数据库)

来源:互联网 发布:java statement 编辑:程序博客网 时间:2024/06/01 09:56

问题背景:

按照分类存取产品,并且产品分类可变更,要求可以根据分类检索到相应产品,当遇到多维度分类时不易于实现,具体如下:

分类信息如下:

********  第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_insertgocreate trigger tgr_Classify_inserton GoodsClassify    after insertas  declare @lvl intselect @lvl=lvl from inserted--获取分类级别if(@lvl=2)--如果添加第二级分类begindeclare @classify2 nvarchar(10);select @classify2=(select classify from inserted)--创建第二级分类对应的商品表IF not EXISTS (SELECT name FROM sysobjects WHERE name =@classify2  AND type = 'U')begindeclare @createtable nvarchar(100)set @createtable='create table ' + @classify2 + '(id int PRIMARY KEY, goodsId int)'exec(@createtable)end--创建结束endif(@lvl=3) --如果添加第三级分类 此级存放商品分类规则begindeclare @classify3 nvarchar(10), @parent nvarchar(10);select @classify3 = classify , @parent = parent from insertedIf not exists (select * from syscolumns where id=object_id(@parent ) and name=@classify3)begindeclare @addColumn nvarchar(100)set @addColumn='alter table ['+@parent +'] add '+@classify3+' nvarchar(10) null'print @addColumnexec(@addColumn)endendgo


现在进行如下几部测试看下效果:

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表中检索

按照条件 : 服务项目=“洗车” & 洗车方式=“人工洗车” ”  可以在洗车表里检索

按照条件 : 服务项目=“洗车” & 洗车方式=“人工洗车” & 其他属性=“某某某”  可以在洗车表里检索


备注,为了加快检索速度,可以在某些列上建立索引





0 0