Какой подход я должен использовать в этом случае? - PullRequest
1 голос
/ 04 января 2010

Я реализовал шаблон Data Mapper с шаблоном Identity Map. Вкратце: когда я хочу получить 2000 объектов из базы данных, картограф проверяет набор результатов по хеш-карте, которая содержит ссылки на уже созданные объекты. Если идентификатор уже находится в хэш-карте, старый объект добавляется в массив возврата. В противном случае новый объект создается и добавляется в возвращаемый массив. Возвращаемый массив будет содержать 2000 объектов.

Примечание: это цифры теоретические! Платформа может часто посещаться, поэтому это может происходить много раз в минуту или даже секунду.

Вопрос: Какой вариант лучше и почему?

A) Получить все 2000 объектов из базы данных. Выполните итерацию по набору записей (2000 строк) и проверьте каждый идентификатор на соответствие карте идентификации. Если он там, добавьте ссылочный объект карты идентификации в массив объектов. Если нет, создайте новый объект и добавьте его в массив результатов.

B) Создайте (возможно ОГРОМНЫЙ) SQL-запрос, который исключает все идентификаторы, которые есть в карте идентичности. Получить набор записей, который содержит только данные для новых объектов. Создавайте новые объекты, не проверяя карту идентичности для каждой строки. Включает в себя множество операций конкатенации строк для построения запроса, но может сохранить целую кучу поисков хеш-карты.

Какой подход вы бы выбрали? (да, я знаю, я должен просто реализовать обе версии и провести тест производительности, но, возможно, кто-то может ответить на этот вопрос из практического опыта)

1 Ответ

0 голосов
/ 04 января 2010

Я бы пошел с Б.

Не думаю, что это потребует сложной конкатенации строк. Предполагая, что ваши идентификаторы являются простыми ключами массива, вы можете просто сделать:

$ids   = implode(',', array_keys($hashmap));
$query = sprintf('SELECT * from records WHERE id NOT IN (%s)', $ids);

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

Если вы уже используете SplObjectStorage для хэш-карты, вам придется выполнить итерацию по карте, чтобы получить идентификаторы из сохраненных объектов. В зависимости от количества предметов, которые уже есть, и количества, которое можно получить, вам может быть лучше с A или B. Это зависит. Но с SplObjectStorage вам не придется беспокоиться о присоединении уже существующих объектов, так как об этом уже позаботились изначально, например,

$map = new SplObjectStorage;
$one = new StdObject;
$map->attach($one);
$map->attach($one);
$map->count(); // returns 1

Так что да. Я предполагаю, что это контрольный вопрос и зависит от вашего конкретного сценария.

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