Użytkownik "Jason Davidson" <[EMAIL PROTECTED]> napisał w wiadomości
news:[EMAIL PROTECTED]
> When i have many many objects of the same type to build, i do something
> like this...
>
> function getEvents($sql = '') {
> $events = $this->dbh->query("
> SELECT cols, cols, FROM table,table
> WHERE blah blah balh ($sql ? " AND $sql" : ''),'rows_array');
>
> $rv = array();
> foreach($events as $event) {
> $rv[] = new CalendarEvent($event);
> }
>
> return $rv;
> }
>
> my event class takes an array of data and uses phps list function to
> load its members.  In this case, i save 100s and 100s of queries ,
> using just 1.  Its a massive improvment if it fits your scheme.  To get
> one event, i create a method called getEvent($id) that is a wrapper to
> getEvents, and only uses the first record.. of coarse, there is only
> one record.. but ya.. cheers
>
> Jason
>
> Marcus Bointon <[EMAIL PROTECTED]> wrote:
> >
> > on 19/8/04 9:49, Krzysztof Gorzelak at [EMAIL PROTECTED] wrote:
> >
> > > Hi
> > > I'm trying my new php5 script, but it takes about 1.2s to generate my
page.
> > > That is, how my oop model looks like :
> > >
> > > [category]
> > >   |        |                |
> > > [photo]  [desc]   [products]
> > >
> > >
> > > [products]
> > > |
> > > [product]
> > > |            |            |
> > > [photo] [desc] [keys]
> > >
> > >
> > > [keys]
> > > |
> > > [key]
> > > |
> > > [values]
> > > |
> > > [value]
> > >
> > >   Each object gets data from mysql by itself. The generation time of 1
> > > category [30 products, 10 keys, 5 values ~= 300 mysql queries] takes
as I
> > > said more than a 1s (on quite fast machine). How can this model be
improved?
> > > Do I create too many objects ? What are the oop solutions for such
problem ?
> >
> > This is something that I've wrestled with too. If you make each item you
> > deal with a clean, self-sufficient object, with self-storage, data
hiding
> > etc, it is inevitable that you run into this problem. It is a symptom of
a
> > fundamental clash between Relational DB and OO points of view. The only
> > trick I have found to work around it that is OO-clean is to use factory
> > methods or objects that create multiple objects from a single DB query,
so
> > as well as having a 'get' method that populates an object from a DB,
make
> > another means of creating an object from local data that has been
obtained
> > from a larger query that returned sufficient values to populate multiple
> > items.
> >
> > > I also use an extra table to create many-to-many relation betwean a
product
> > > and a key. Is this the only way in mysql ?
> > >
> > > [product]
> > > |
> > > [product_id, key_id]
> > >                   |
> > >                   [key]
> >
> > Yes, that's the correct way to represent a M:M relation in a relational
DB.
> > The join table is an artefact of a relational model, rather than an OO
one,
> > so the answer is to hide the existence of this table within the objects
at
> > either end - so have product and key objects, but not product_key
objects.
> > Each object should have a method that retrieves instances of all the
related
> > objects of the other kind. This is really a different manifestation of
the
> > first problem.
> >
> > Ultimately the trick is to create separate factory objects or
higher-level
> > methods inside the existing objects that can create multiple instances
from
> > a single database query. Having said that, it's difficult to spot the
best
> > places to do this. For example, you might normally create multiple
product
> > objects from an array of database IDs like so:
> >
> > foreach($productids as $id)
> >     $products[] = new product($id);
> >
> > You can see that this would cause a query for each instantiation.
> >
> > With a product factory class, you might do this instead:
> >
> > $products = product_factory::get($productids);
> >
> > Which achieves the same result, but using only a single DB query (hidden
> > inside the factory class, which does NOT call the product class in the
same
> > way!). The next problem is keeping your product_factory and product
classes
> > in sync - I'm sure there must be a nice pattern to deal with that
somewhere.
> >
> > Marcus
> > --

Thanks a lot, after your replies I made a little google search on 'factory
class' and found a great article:
http://www.phppatterns.com/index.php/article/articleview/49/1/1/. My objects
are still too slow (0,3s) but now I'm going to try Advanced PHP Debugger.

Krzysztof Gorzelak

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to