[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос по паттерну identity map
chee
Использую этот паттерн, что бы объекты в системы всегда были в одном экземпляре. Вопросов нет если его использовать примерно так

$entity = $repository->read(123);

Я по идентификатору(indentity field) могу в хранилище найти нужны объект.

Но возникают проблемв при получении списка объектов

$entities = $repository->findBy(['status' => 'cancel']);

Возвратит сущности как и пологается и сохранит их в identity map. Но проблема в том, что если мне нужно будет получить список записей снова, то мне придется опять выполнять запрос в бд, для получения данных этих записей, но у меня уже есть данные в identity map и как бы этот запрос избыточен.

То есть, вопрос, как в рамках этого паттерна избавиться от бесмысленных запросов к бд?

Вторая ситуация, у меня есть такая выборка

$entities = $repository->findBy(['status' => 'cancel']);

а потом я делаю такую

$entities = $repository->findBy(['deleted' => '0']);

И допустим, выбранные сущности пересикаются, и на момент второго запроса уже появились изменения в строках БД, синкать ли мне эти данные или игнорировать?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
T1grOK
Цитата (chee @ 9.01.2015 - 21:21)
Возвратит сущности как и пологается и сохранит их в identity map. Но проблема в том, что если мне нужно будет получить список записей снова, то мне придется опять выполнять запрос в бд

Зачем запрос к бд еще раз, если в identity map уже есть все что нужно?
Или у тебя при findBy итерируется результат и каждая сущность отдельно добавляется в identity map? Так кто мешает в дополнение к этому сделать indentity field ко всей коллекции?

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
chee
Цитата (T1grOK @ 10.01.2015 - 13:58)
каждая сущность отдельно добавляется в identity map

да
Цитата (T1grOK @ 10.01.2015 - 13:58)
Так кто мешает в дополнение к этому сделать indentity field ко всей коллекции?

Слишком много identity полей будет, не? Я ведь за ранее не знаю по каким полям искать хочу. Получается мне нужно будет identity полями сделать все атрибуты модели. А потом при вызове findBy перебирать модели в памяти для поиска по атрибутам. Как-то все муторно.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
T1grOK
Цитата (chee @ 10.01.2015 - 11:17)
Как-то все муторно.

Поддержание целостности информации в identity map при всех хотелках выйдет боком, так как это может оказаться гораздо дороже дополнительного запроса.
Цитата (chee @ 10.01.2015 - 11:17)
Получается мне нужно будет identity полями сделать все атрибуты модели. А потом при вызове findBy перебирать модели в памяти для поиска по атрибутам.

Нет. Сущности разворачиваем из колекции в identity map классическим способом.
После чего создаем identity field для коллекции, в качестве чего используем хеш объект + criteria, и туда пихаем всю коллекцию.
В итоге мы будем иметь один экзепляр данных, но ссылаться на них будем из нескольких мест. Это что касается выборки.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
chee
T1grOK, я не понял


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
T1grOK
function findBy($conditions)
{
$hash = md5(class_name($this), serialize($conditions));
if(($entities = IdentityMap::instance()->get($hash))){
return $entities;
}


...формируем запрос, извлекаем данные бла бла


foreach($entities as $entity){
IdentityMap::instance()->add(class_name($entity), $entity);
}
IdentityMap::instance()->add($hash, $entities);
return $entities;
}

Тип такого...

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
chee
T1grOK, это первое что пришло мне тогда в голову, но что то это выглядит очень костыльно.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.