Результаты запроса ORM: массивы и дескрипторы результатов, заключенные в интерфейс IteratorPhp

Кемеровские программисты php общаются здесь
Anonymous
Результаты запроса ORM: массивы и дескрипторы результатов, заключенные в интерфейс Iterator

Сообщение Anonymous »

Хорошо, вот один вариант для профессионалов:
Уже пару лет я работаю над своей собственной реализацией PHP ORM/ActiveRecord, которую я назвал Pork.dbObject.
Она основана на фильме «Создайте свой собственный сайт с помощью рельсов за 5 минут», который мы все видели пару лет назад. Вы можете делать такие вещи, как:

Код: Выделить всё

$clients = dbObject::Search("Client", array("ID > 500"));
или

Код: Выделить всё

$client = new Client(218); // fetch row with id 218 from client table
или

Код: Выделить всё

$projects = $client->Find('Project');
Это извлечет одну или несколько строк из базы данных, обернет их в dbObject и вернет в один массив или вернет false, если нет результатов.
Все это отлично работает на десятках сайтов и бэкэндов, но теперь мой коллега использует это для создания огромного анализатора журналов, и здесь начинаются проблемы с использованием памяти.
Запросы, которые он выполняет, могут возвращать более 20 000 строк, а может быть, и больше, что, конечно, не очень хорошая вещь, чтобы обернуть все сразу в оболочку объекта и вернуть как один массив.
Очевидным решением было бы возвращать объект, реализующий интерфейс Iterator, вместо массива. Он не должен мгновенно извлекать все записи из набора результатов, а просто хранить ресурс результата для сгенерированного запроса к базе данных и использовать mysql_fetch_* внутри себя, когда вы перемещаетесь по объекту, как если бы это был массив.
Теперь мы переходим к моему реальному вопросу:
Могу ли я без проблем просто сделать это? Могут ли базы данных обрабатывать несколько открытых наборов результатов, смешивать их и хранить в памяти какое-то время?
Например, извлеките 20 объектов, зациклите их, пусть каждый из этих 20 извлекает 5 других, которые, в свою очередь, также извлекают 3 других. Это создаст цикл, в котором в памяти будет храниться несколько различных дескрипторов результатов.
Я знаю, что не могу сериализовать один из этих объектов, но смогу ли я без проблем реализовать это в PHP5, или интерфейсы базы данных вызовут у меня проблемы?

Подробнее здесь: https://stackoverflow.com/questions/531 ... -interface

Вернуться в «Php»