网站产品规格缩小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

网站产品规格缩小URL列表

好的,让我们从简单的开始。我认为,您需要做的第一件事是显示可用规格及其值的列表。很容易…

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

如果我写的正确的话,它应该约束那些已经选择的可用规格值。如果不是,它可能会做一些完全不同的事情。: -)

我是不是把这个简单化了?它回答你的问题了吗?