因此,我正在研究Web应用程序中的功能。问题是这样的-
我有四个不同的实体。假设它们是-Item1
,Item2
,Item3
,Item4
。该功能分为两个阶段。假设第一阶段是-Choose entities
。在第一阶段,用户可以选择为每个实体选择多个项目,对于该选择中的每个组合,我都需要进行一些计算。然后在第二阶段(假设Relocate phase
)-根据在第一阶段完成的计算,对于每种组合,我将不得不让用户选择另一个组合,其中第一组合的值将被删除到行中第二种组合。
这里是用于进一步说明的数据模型-
EntityCombinationTable
(
Id
Item1_Id,
Item2_Id,
Item3_Id,
Item4_Id
)
ValuesTable
(
Combination_Id,
Value
)
所以假设我在两个值中都有以下值-
EntityCombinationTable
Id -- Item1_Id -- Item2_Id -- Item3_Id -- Item4_Id
1 1 1 1 1
2 1 2 1 1
3 2 1 1 1
4 2 2 1 1
ValuesTable
Combination_Id -- Value
1 10
2 0
3 0
4 20
因此,如果在第一阶段-我为项目1选择(1,2),为项目_2选择(1,2),为项目3和项目4选择1,那么总组合将为2 * 2 * 1 * 1 = 4。
然后在第二阶段中,对于值大于零的每个组合,我将不得不让用户选择其他组合,以重新分配值。
例如-由于仅具有ID 1和2的组合的值大于零,因此第二个对话框中仅需要显示两个重定位组合。因此,如果用户在第二阶段中选择(3,3,3,3)和(4,4,4,4)作为重定位组合,则需要在其中插入新行
EntityCombinationTable
代表(3,3,3,3)和(4,4,4,4)。并且(1,1,1,1)和(2,2,1,1)的值将分别重定位到与(3,3,3,3)和(4,4,4,4)中对应的行ValuesTable
。
问题是-每个实体的项目最多可以包含100个甚至更多。因此,在最坏的情况下,组合的总数可能是10 ^ 8,这将导致数据库的工作量很大(插入和更新表中的大量行),并且在代码级别生成所有组合都将需要大量时间。
我曾考虑过一种不将项目组合在一起的替代方法。而是为每个实体保留单独的表。然后在运行时进行组合。这也将导致性能问题。因为有更多不同的阶段可能需要组合。所以每次我都需要生成所有组合。
我还考虑过创建键值对类型表,在该表中将组合保留为字符串。但是用这种方法,我实际上并没有减少要插入的行数,而是减少了列数。
所以我的问题是-在这种情况下,有什么更好的方法可以跟踪组合并以优化的方式进行操作?
注意-我不确定这是否有帮助,但是values表中的许多行的值可能都为零。因此,在第二阶段中,我们需要显示比实际可能组合数少得多的行