首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂产品选择建模

复杂产品选择建模
EN

Software Engineering用户
提问于 2017-01-13 14:38:50
回答 4查看 630关注 0票数 6

我已经就一个特定的问题集思广益了一段时间了,今天我想出了一个解决办法。但我不太确定。因此,这个问题需要反馈和建议。

我将使用产品T-Shirt的简单示例。

T恤有多种选择:

ColorWhiteBlack

SizeSmallMediumLarge

现在,在White T恤上,没有LargeMedium.因此,在选择LargeMedium选项时,不应提供White选项。

这意味着,如果您首先选择LargeMedium。那么White不应该可用。

以前的实现是作为树结构完成的。因此,您总是必须选择Color,然后选择Size。但在我看来,这不是一棵树。

我的想法是创建一个规则列表。

伪码:

代码语言:javascript
复制
rule1: if color is white, sizes not allowed are [large, medium]

//then generate the opposite rules based on rule1.
rule2: if size is medium, color not allowed are [white]
rule3: if size is large, color not allowed are [white]

store rules in database

当您处理有许多选项的产品时,这可能会变得复杂,这就是为什么我认为基于第一个规则生成其他规则可以降低复杂性。

有人在想吗?

更新:

有人在下面评论,我意识到我使用了错误的例子。这不是一个有SKU和库存水平的产品。是一种服务。一个更好的例子是可配置的计算机。许多不同的CPU,RAM,GPU等组合。这一切产生不同的价格和取决于特定的主板或一些特定的选择,并不是所有的CPU和/或RAM等是可以选择的。

Update2:

产品/服务各有7种左右的选择。每个选项可以有2-7个值。建议的矩阵结构将成为海事组织的复杂结构。

此外,我们已经从对每一个变化都有一个价格(这是荒谬的管理)转移到有公式的动态生成价格。

由于树结构,DB加载始终存在问题。每次选择一个选项时,它都必须获取后续选项的值。每次向选项添加新值时,也会重复许多后续选项。所以它很快就失控了。

为了深入了解更多细节,我的解决方案是使用基于文档的数据库(NoSQL),您将拥有一个“产品”或“服务”集合。

每个产品/服务看起来都是这样的:

代码语言:javascript
复制
{
  "product": "T-Shirt",
  "options": {
    "size": [],
    "color": [],
    "pattern": [],
    ... about 4 more
  },
  "rules": [....],
}

最初,您只需加载接口中的所有选项。然后,在进行选择时,运行规则以禁用指定的选项值。

在我看来,使用这种结构可以减少开销,方法是将规则嵌入到每个产品/服务中,而不是有一个包含所有选项的大型关系表(这已经很大了)。

客户端有好处,因为它不必每次更改选项时都查询DB。

EN

回答 4

Software Engineering用户

发布于 2017-01-15 12:41:54

树(您现有的实现)更易于建模,但是您按照用户需要选择他们想要的产品种类的顺序施加限制。如果这对您不好,那么对所有组合(现有的或未来的)建模的一种通用方法是将组合表示为一个由字符串索引的多维数组,而不是数字(实际上更像是多维字典)。

在用户的回答中,表示的是一个三维数组:Product x Color x Size。在所有列的交集处,存储一个布尔值。如果是['t-shirt', 'white', 'large'] == false,那么你就没有一件白色的大T恤。如果这是真的,那你就有了。

当然这很快就会变得复杂起来。添加产品和选项的越多,就会向数组中添加更多的维度。以上4个维度,很难想象您的数据结构或考虑它。存储的值的数量也会增加。

但是,如果您只有几个例外,那么您可能只能对那些具有多维数组的对象进行建模。基本上,您假设组合是有效的,然后在多维异常数组中查找该值,以查看该值是否存在。如果是这样的话,那么假设是错误的,这意味着你没有那种特殊的组合。

多维数组的优点是您可以从任意方向查看它。第一种颜色然后是大小,或者是第一种大小然后是颜色,这都是一样的。你最终到达所有选项相交的单元格,你会看到你在那里有什么价值。缺点是数组的大小可能会变得非常大,而且每当添加新维度时都需要重新构建值。

您制定规则的解决方案也可能有效。它类似于多维数组,但是建模执行(如果-然后-否则),而不是基于某些值的数据查找(数据查找比规则逻辑更简单)。

票数 3
EN

Software Engineering用户

发布于 2017-01-16 18:58:18

您可能需要查看实体属性值设计,以便对具有多种类型属性的任意值的事物进行建模。

我从Magento,一个电子商务应用程序那里学到了这个设计模式。你可以了解他们如何在这里使用EAV

票数 2
EN

Software Engineering用户

发布于 2017-01-13 15:46:51

我可能会为每个产品存储一组选项。因此,对于t恤来说,有一套可供选择的选项:

代码语言:javascript
复制
{ 
    {"color:white", "size:small"},
    {"color:black", "size:small"},
    {"color:black", "size:medium"},
    {"color:black", "size:large"}
}

这是您需要的所有数据,以识别产品所具有的选项类型(“颜色”、“大小”)、每种类型的可用值以及允许以产品有效顺序排列的选项组合。

请注意,只有当选项和值的选择相对有限时,此模型才能工作。允许任何24位RGB颜色作为一个选项是不可行的。这些集合会变得太大,无法存储和处理。

(注意:上面的语法不应该是JSON或其他任何东西。技术是无关紧要的。那些{}s表示数学中的集合。集合中的对象(选项)可以是字符串,也可以是某种自定义类型。关键是要有一个简单的数据集,它代表一个产品的每一个可行的选项组合。)

编辑:在阅读了问题的Update2后,我会说这不是一个可行的解决方案。不过,这将适用于基于产品库存水平的一组有限期权。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/340127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档