Вопрос о создании огромного запроса огромного объекта? - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над устаревшим проектом компании.Там есть огромный объект, который построен по очень длинному запросу.Запрос как-то выглядит следующим образом.

SELECT *
FROM item i 
JOIN item_product prod on prod.item = i.id
LEFT JOIN product_shippingaddress ps on pa.product = prod.id
LEFT JOIN product_packageinfo pp on pp.product = prod.id
.
.
.
(80 lines of query)
WHERE item.id = @itemId

Этот очень длинный запрос включает в себя много информации об этом продукте.

Он создает огромный объект "Item", который предоставляет все виды информации опредмет.Взяв приведенный ниже пример того, как все работает в настоящее время

int itemId = createItem(); //creates a record in item table
associateAddressToItem(item); // Add a shipping address to item
for(int productId in productsToAdd){
     addProduct(itemId); // insert info into item_product table
}
Item item = getItem(item); // This function invokes the huge query to collect information of a single item
for(Product product in item.products){
     UpdateItemPrice(product.Id,itemId);
     if (product.shippable()) 
     {
         addItemTax(itemId, product.Id); // add tax based on address and product attribute
     }
}
item = getItem(itemId); // calls the query to update information of the object
charge(item); //charge based on item's price and tax

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

Есть ли лучший способ справиться с такой ситуацией?Я чувствую, что это не оптимизировано, но я могу найти способ улучшить его.

1 Ответ

0 голосов
/ 13 марта 2019

Пока я правильно понял ваш вопрос, вот что вы делаете:

  1. Создание пустой записи в таблице.
  2. Заполнение таблицы(item_product) с некоторыми данными, которые вы получили.
  3. Запрос этих данных снова .
  4. Обновление данных.
  5. Запрос этих данных еще раз.x2
  6. Обновление данных.x2

И все это делается с помощью запроса к базе данных.

Что я предлагаю вам сделать:

  1. Сначала обновите объект Item в памяти,выполняйте как можно больше вычислений, не обращаясь к базе данных.
  2. Запросите идентификатор для новой записи.
  3. Обновите данные в базе данных. Один раз .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...