网站产品规格缩小URL列表
本文关键字:列表 URL 缩小 产品规格 网站 | 更新日期: 2023-09-27 18:09:42
我正在寻找面向对象(c#)或函数式(f#)编程语言中更简单或优雅的解决方案来解决以下问题。
给定电子商务网站上数千种具有规格的产品,请考虑缩小规格的排列范围。具体地说,产生客户可能感兴趣的不同产品集的最小规格集是什么?
用户有机会按照任何规格进行购物。比如螺栓。它们有钻头尺寸,光洁度(普通,锌等),头部类型,头部高度,等级,长度,包装数量等
在一个平均的产品类别中,假设有1000种产品和10种规格。如果每个规范都可以添加到URL中,那么可能的页面是什么?然而,我不仅仅对所有的排列感兴趣。考虑以下几点:-通过选择一个规格,许多其他规格也被选中,因为它们是由剩下的一组产品共享的,并且可以显示给网站用户,也在列出的产品之间共享-一旦只列出一种产品,自然会选择所有剩余的规格-通过在URL上按严格的顺序(如字母顺序)放置规范,这可以减少不必要的重复
首先,这个问题是用递归SQL (CTE语法)解决的,这变得非常笨拙,在能够开始清除重复之前,每个类别产生数百万个组合。
现在,我正在研究c#一次承担一个类别。规格类型按字母顺序排列2)所有产品集与所有其他产品集使用以下代码进行比较,以便自动选择/自动定义附加规格:
public bool DefinesThisValue(CategoryValue value)
{
if (this.ProductIds.Count > value.ProductIds.Count) return false;
var intersect = this.ProductIds.Intersect(value.ProductIds);
return intersect.Count() == this.ProductIds.Count;
}
2)接下来,它尝试遍历所有选择序列,根据上述,每次选择后,如果有多个额外的可选择规格,则将一个附加路径节点添加到一个集合和复制/分裂的路径对象中
我当前的解决方案需要大量调试,并且变得过于复杂。也许熟悉集合理论和f#的人可以提出一些很棒的建议。谢谢你的考虑。
作为对Daniel的回应,这里是数据的SQL布局。
数据结构:表:
CREATE TABLE Category
(
Id int identity not null,
PRIMARY KEY CLUSTERED (Id)
)
CREATE TABLE Spec
(
Id int identity not null,
CategoryId int not null REFERENCES Category(Id),
Name varchar(100) not null,
PRIMARY KEY CLUSTERED (Id)
)
CREATE TABLE SpecValue
(
Id int identity not null,
SpecId int not null REFERENCES Spec(Id),
Value varchar(200) not null,
PRIMARY KEY CLUSTERED (Id)
)
CREATE TABLE Product
(
Id int identity not null,
PRIMARY KEY CLUSTERED (Id)
)
CREATE TABLE SpecValueProduct
(
Id int identity not null,
SpecValueId int not null REFERENCES SpecValue(Id),
ProductId int not null REFERENCES Product(Id),
PRIMARY KEY NONCLUSTERED (Id)
)
一个简单的示例可能包括以下示例数据:
Product 1: Coffee Maker A, Color: Black, Cups: 2
Product 2: Coffee Maker B, Color: Black, Cups: 4
Product 3: Coffee Maker C, Color: Grey, Cups: 4
在这个例子中,如果Color: Grey被选中,那么Cups: 4也被定义。但是,如果选择了Color: Black,则用户可以选择Cup: 2或Cups: 4。
url可能像这样:'site.com'coffee-makers?Color=Black&Cups=4
好的,让我们从简单的开始。我认为,您需要做的第一件事是显示可用规格及其值的列表。很容易…
select s.Name, v.Id, v.Value
from SpecValue v
inner join Spec s on s.Id = v.SpecId
where s.CategoryId = @CategoryId
如果你愿意,你也可以将其加入SpecValueProduct
,以限制当前使用的规格/值。
接下来,当选择规格值时,您需要运行类似的查询,但将其限制为相关值,即应用于所选规格/值存在的产品的值。
给定参数:
declare @SelectedSpecValue table (SpecValueId int)
你可以这样写
select distinct s.Name, v.Id, v.Value,
cast(case when n.SpecValueId is null then 0 else 1 end as bit) as IsSelected
from SpecValue v
inner join Spec s on s.Id = v.SpecId
inner join SpecValueProduct p on p.SpecValueId = v.Id
inner join
(
select distinct y.ProductId
from SpecValueProduct y
inner join @SelectedSpecValue z on z.SpecValueId = y.SpecValueId
) x on x.ProductId = p.ProductId
left join @SelectedSpecValue n on n.SpecValueId = v.Id
where s.CategoryId = @CategoryId
如果我写的正确的话,它应该约束那些已经选择的可用规格值。如果不是,它可能会做一些完全不同的事情。: -)
我是不是把这个简单化了?它回答你的问题了吗?