2010-12-07 3 views
0

Я буду быстро и просто на этом. В основном мне нужно быстро и быстро объединить несколько счетов-фактур (Объект).OO производительность вопрос

Простая идея состоит в том, чтобы

$invoice1 = new Invoice(1); 
$invoice2 = new Invoice(2); 
$invoice3 = new Invoice(3); 
$invoice1->merge($invoice2,invoice3); 
$invoice1->save(); 

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

Однако это тот случай, когда один запрос

SELECT * FROM invoice WHERE id IN (1,2,3) 

хватит, однако реализация не будет столь же элегантно, как указано выше.

Исходные контрольные показатели по данным образца указывают на снижение скорости на 2,5x-3x выше из-за большого количества запросов mysql.

Совет

ответ

2

Использовать фабрику счетов. Вы запрашиваете его для счетов, используя различные методы. new (n) get (id) get (array (id, id, id)) и так далее, и он возвращает массивы счетов-фактур или отдельных объектов-фактур.

<?php 
    $invoice56 = InvoiceFactory::Get(56); // Get's invoice 56 
    $invoices = InvoiceFactory::Newest(25); // Get's an array of the newest 25 invoices 
?> 
+1

Кроме того, обратите внимание на [ `func_get_args()`] (Http: // php.net/manual/en/function.func-get-args.php), чтобы один и тот же дескриптор реализации «Get (id)», «Get (idA, idB)» и «Get (id1, id2,. .. idN) `. – jensgram 2010-12-07 14:24:19

0

Не могли бы вы сделать Invoice объект ленивым и пусть merge нагрузки все, что не была загружена?

0

Убедитесь, что вы работаете с одним и тем же соединением db все время. Убедитесь, что он не повторно подключается в одном потоке выполнения скрипта.

0

Я мог бы предложить изучить использование фактического ORM (реляционное сопоставление объектов), чтобы создать разделение между вашими реальными запросами и используемыми объектами. Взгляните на Propel или (мою любимую) Doctrine (версия 2 - очень простой в использовании)

Таким образом, вы могли бы иметь именно то, что вы хотите в точно такой же объем кода ...