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