Я работаю над устаревшим проектом компании.Там есть огромный объект, который построен по очень длинному запросу.Запрос как-то выглядит следующим образом.
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.Я не думаю, что это вообще эффективно, поскольку он выполняет огромный запрос дважды.Тем не менее, я думаю, что это необходимо в настоящее время, потому что для обновления объекта необходимо извлечь информацию, хранящуюся в базе данных.
Есть ли лучший способ справиться с такой ситуацией?Я чувствую, что это не оптимизировано, но я могу найти способ улучшить его.