|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 17 Dec 2002 21:11:19 To : Andrey Brindeew Subject : Re: Strong OO-programming & SQL databases -------------------------------------------------------------------------------- Здравствуй, Andrey Brindeew. AB> Как в конструкторе создать несколько экземпляров класса Object::Good Если их создается несколько, то это уже не конструктор, а factory. AB> (соответственно и нужное кол-во инстансов Object::Good::Category) AB> оптимально с точки зрения базы? При создании объектов в цикле будет столько AB> SQL-запросов, сколько объектов создается, что не есть хорошо с точки зрения AB> производительности. Основная идея - factory отбирает нужные записи, а потом зовет конструкторы уже не на на основании базы, а на основании готовых данных. AB> Можно передавать условия WHERE, ORDER BY и т.п., но их как-то нужно AB> автоматически обрабатывать при вызове конструкторов дочерних объектов - AB> Object::Good::Category в моем примере). Так надо передавать не WHERE, а внятное с точки зрения твоей конструкции условие. Из которого в factory генерировать WHERE. AB> Если ограничиться только списком передаваемых Id объектов (суть primary AB> keys в таблицах), то приходим к изврату: сначала в скрипте нужно сделать AB> отбор этих самых Id, потом со списком Id нужно вызвать конструктор AB> Object::Good, который оттранслирует переданный список в WHERE id IN (". AB> join(",", @{ $id }) .")". И тут наступаем на большие грабли со стороны AB> многоуважаемой фирмы Sybase: WHERE может состоять максимум из 255 условий, AB> соединенных AND или OR (предложение IN оптимизируется внутри Sybase как id AB> = 1 OR ... OR id = k). Другие СУБД насчет этого специально не смотрел, но AB> на особые улучшения не надеюсь. Соответственно, покусать на части. Если подобное встречается часто, то сделать свой промежуточный слой, который будет бить список на кусочки, дергать базу несколько раз, суммировать результаты и возвращать просуммированное. Естественно, оный слой должен получать не готовый WHERE clause, а структуру, удобную для перловой обработки. -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/144542521f1eb.html, оценка из 5, голосов 10
|