Итак, я работаю над функцией в веб-приложении. Проблема в следующем
У меня есть четыре разных лица. Допустим, это - 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,2) для Item1, (1,2) для Item_2 и 1 для Item_3 и Item4, то общая комбинация будет 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, что приведет к очень большой нагрузке на базу данных (вставка и обновление огромного числа строк в таблице), а также к генерации всех комбинаций на уровне кода потребует существенного время.
Я подумал об альтернативном подходе, чтобы не хранить предметы как комбинацию. Скорее держите отдельную таблицу для каждой сущности. а затем составьте комбинацию во время выполнения. Что также может вызвать проблемы с производительностью. Поскольку есть много разных этапов, где мне может понадобиться комбинация. Поэтому каждый раз мне нужно будет генерировать все комбинации.
Я также думал о создании таблицы типа пары ключ-значение, где я бы сохранил комбинацию в виде строки. Но в этом подходе я не уменьшаю количество вставляемых строк, а сокращает количество столбцов.
Так что мой вопрос - есть ли лучший подход к такой ситуации, когда я могу отслеживать комбинации и манипулировать оптимизированным способом?
Примечание. Я не уверен, поможет ли это или нет, но многие строки в таблице значений будут иметь нулевое значение. Таким образом, на втором этапе нам нужно будет показать намного меньше строк, чем фактическое количество возможных комбинаций