我已经就一个特定的问题集思广益了一段时间了,今天我想出了一个解决办法。但我不太确定。因此,这个问题需要反馈和建议。
我将使用产品T-Shirt的简单示例。
T恤有多种选择:
Color:White,Black
Size:Small,Medium,Large
现在,在White T恤上,没有Large和Medium.因此,在选择Large和Medium选项时,不应提供White选项。
这意味着,如果您首先选择Large或Medium。那么White不应该可用。
以前的实现是作为树结构完成的。因此,您总是必须选择Color,然后选择Size。但在我看来,这不是一棵树。
我的想法是创建一个规则列表。
伪码:
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等是可以选择的。
产品/服务各有7种左右的选择。每个选项可以有2-7个值。建议的矩阵结构将成为海事组织的复杂结构。
此外,我们已经从对每一个变化都有一个价格(这是荒谬的管理)转移到有公式的动态生成价格。
由于树结构,DB加载始终存在问题。每次选择一个选项时,它都必须获取后续选项的值。每次向选项添加新值时,也会重复许多后续选项。所以它很快就失控了。
为了深入了解更多细节,我的解决方案是使用基于文档的数据库(NoSQL),您将拥有一个“产品”或“服务”集合。
每个产品/服务看起来都是这样的:
{
"product": "T-Shirt",
"options": {
"size": [],
"color": [],
"pattern": [],
... about 4 more
},
"rules": [....],
}最初,您只需加载接口中的所有选项。然后,在进行选择时,运行规则以禁用指定的选项值。
在我看来,使用这种结构可以减少开销,方法是将规则嵌入到每个产品/服务中,而不是有一个包含所有选项的大型关系表(这已经很大了)。
客户端有好处,因为它不必每次更改选项时都查询DB。
发布于 2017-01-15 12:41:54
树(您现有的实现)更易于建模,但是您按照用户需要选择他们想要的产品种类的顺序施加限制。如果这对您不好,那么对所有组合(现有的或未来的)建模的一种通用方法是将组合表示为一个由字符串索引的多维数组,而不是数字(实际上更像是多维字典)。
在用户的回答中,表示的是一个三维数组:Product x Color x Size。在所有列的交集处,存储一个布尔值。如果是['t-shirt', 'white', 'large'] == false,那么你就没有一件白色的大T恤。如果这是真的,那你就有了。
当然这很快就会变得复杂起来。添加产品和选项的越多,就会向数组中添加更多的维度。以上4个维度,很难想象您的数据结构或考虑它。存储的值的数量也会增加。
但是,如果您只有几个例外,那么您可能只能对那些具有多维数组的对象进行建模。基本上,您假设组合是有效的,然后在多维异常数组中查找该值,以查看该值是否存在。如果是这样的话,那么假设是错误的,这意味着你没有那种特殊的组合。
多维数组的优点是您可以从任意方向查看它。第一种颜色然后是大小,或者是第一种大小然后是颜色,这都是一样的。你最终到达所有选项相交的单元格,你会看到你在那里有什么价值。缺点是数组的大小可能会变得非常大,而且每当添加新维度时都需要重新构建值。
您制定规则的解决方案也可能有效。它类似于多维数组,但是建模执行(如果-然后-否则),而不是基于某些值的数据查找(数据查找比规则逻辑更简单)。
发布于 2017-01-16 18:58:18
您可能需要查看实体属性值设计,以便对具有多种类型属性的任意值的事物进行建模。
我从Magento,一个电子商务应用程序那里学到了这个设计模式。你可以了解他们如何在这里使用EAV。
发布于 2017-01-13 15:46:51
我可能会为每个产品存储一组选项。因此,对于t恤来说,有一套可供选择的选项:
{
{"color:white", "size:small"},
{"color:black", "size:small"},
{"color:black", "size:medium"},
{"color:black", "size:large"}
}这是您需要的所有数据,以识别产品所具有的选项类型(“颜色”、“大小”)、每种类型的可用值以及允许以产品有效顺序排列的选项组合。
请注意,只有当选项和值的选择相对有限时,此模型才能工作。允许任何24位RGB颜色作为一个选项是不可行的。这些集合会变得太大,无法存储和处理。
(注意:上面的语法不应该是JSON或其他任何东西。技术是无关紧要的。那些{}s表示数学中的集合。集合中的对象(选项)可以是字符串,也可以是某种自定义类型。关键是要有一个简单的数据集,它代表一个产品的每一个可行的选项组合。)
编辑:在阅读了问题的Update2后,我会说这不是一个可行的解决方案。不过,这将适用于基于产品库存水平的一组有限期权。
https://softwareengineering.stackexchange.com/questions/340127
复制相似问题