【问题标题】:Website Product Specification Narrow Down URL List网站产品规格缩小 URL 列表
【发布时间】:2011-09-27 14:53:09
【问题描述】:

我正在寻找一种更简单或优雅的面向对象 (C#) 或函数式 (F#) 编程语言的解决方案来解决以下问题。

鉴于电子商务网站上有数千种具有规格的产品,请考虑缩小规格的排列范围。具体来说,产生客户可能感兴趣的不同产品集的最小规格集是什么。

用户有机会根据任何规格进行购物。以螺栓为例。它们有钻孔尺寸、表面处理(普通、锌等)、头部类型、头部高度、等级、长度、包装数量等。

在平均产品类别中,假设有 1000 种产品和 10 种规格。如果每个规范都可以添加到 URL,那么可能的页面是什么。但是,我不仅对所有排列感兴趣。考虑以下几点: - 通过选择一个规格,许多其他规格也会被选中,因为它们由剩余的一组产品共享,并且可以显示给网站用户,也可以在列出的产品之间共享 - 一旦仅列出一种产品,所有其余规格自然会被选中 - 通过在 URL 上以严格的顺序(如字母顺序)放置规范,这减少了不必要的重复

首先,使用递归 SQL(CTE 语法)解决了这个问题,这变得笨拙,每个类别产生数百万个组合,然后才能开始清除重复项。

现在,我正在研究一次包含类别的 C#。 1) 规格类型按字母顺序排列 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

在此示例中,如果选择了颜色:灰色,则还定义了杯子:4。但是,如果选择颜色:黑色,则用户可以选择杯子:2 或杯子:4。

网址可能类似于:'site.com\coffee-makers?Color=Black&Cups=4

【问题讨论】:

  • 您要求很多。你能展示你正在处理的数据结构吗?
  • 试图将数据结构的响应放在评论中,没有足够的空间...正在编辑原始帖子。
  • 将其添加到您的问题中并删除评论。它将更具可读性,并将帮助其他人为您提供解决方案。

标签: c# f# set


【解决方案1】:

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

select s.Name, v.Id, v.Value 
from SpecValue v 
  inner join Spec s on s.Id = v.SpecId
where s.CategoryId = @CategoryId

如果您愿意,您也可以将其加入 SpecValueProduct 以将规范/值限制为当前使用的那些。

Next, when spec values are selected, you'll need to run a similar query, but limiting it to relevant values, i.e., those applied to a product where the selected spec/values are present.

给定参数:

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

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

我是否过于简单化了?它回答了你的问题吗?

【讨论】:

  • 这看起来很适合在选择后给出所选值。但是,我正在尝试解决代码中 @SelectedSpecValue 的插入集。换句话说,购物者可以在导航中访问的最小有效和不同的规范值 (URL) 集是什么。
  • @SelectedSpecValue 只是迄今为止选择的值列表。可供选择的值是我回答中的第一个查询——一个简单的SELECT
  • 在我的咖啡机的示例中,选择颜色:灰色选择,然后杯子:2将不再是有效的选择。您的选择将包括此示例。
  • 这将是第二个查询。第一个查询是初始种群。第二个查询将在选择任何(和每个)值后执行。
  • 不知道如何解释我的目的。第二个查询仅在给定一组选择的情况下返回它。但是,给定一个具有 10 种规格的类别,有 10 种可选组合的阶乘集……已经有一百万种……并且一个产品类别中可以有超过 10 种规格。然而,由于我在原始帖子中列出的考虑因素,在这些集合中,并非几乎所有都会产生独特的产品结果。我知道我问了很多,感谢您的任何意见。
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多