Нужен оптимизированный способ обработки комбинации объектов для повышения производительности - PullRequest
0 голосов
/ 26 мая 2019

Итак, я работаю над функцией в веб-приложении. Проблема в следующем У меня есть четыре разных лица. Допустим, это - 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, что приведет к очень большой нагрузке на базу данных (вставка и обновление огромного числа строк в таблице), а также к генерации всех комбинаций на уровне кода потребует существенного время.

Я подумал об альтернативном подходе, чтобы не хранить предметы как комбинацию. Скорее держите отдельную таблицу для каждой сущности. а затем составьте комбинацию во время выполнения. Что также может вызвать проблемы с производительностью. Поскольку есть много разных этапов, где мне может понадобиться комбинация. Поэтому каждый раз мне нужно будет генерировать все комбинации.

Я также думал о создании таблицы типа пары ключ-значение, где я бы сохранил комбинацию в виде строки. Но в этом подходе я не уменьшаю количество вставляемых строк, а сокращает количество столбцов.

Так что мой вопрос - есть ли лучший подход к такой ситуации, когда я могу отслеживать комбинации и манипулировать оптимизированным способом?

Примечание. Я не уверен, поможет ли это или нет, но многие строки в таблице значений будут иметь нулевое значение. Таким образом, на втором этапе нам нужно будет показать намного меньше строк, чем фактическое количество возможных комбинаций

...