Friday, July 31, 2009

Re: Efficient ways to retrieve data from models with high association depth

On Jul 31, 12:15 am, Roel <roel....@gmail.com> wrote:
> Ah I like your idea of encapsulating the two finds in a model method.
> That seems much better than putting the logic in the controller.
> Thanks.
>
> Could you please elaborate on the Linkable (and OneQuery) behavior?
> Anything with regard to optimizing database performance for related
> models seems relevant to me.

Given that A belongsTo|hasOne B belongsTo|hasOne C belongsTo|hasOne D
belongsTo|hasOne E etc.

you'll get n queries with cake, and 1 query using Linkable/OneQuery.
They're used in a similar fashion to containable.

Cheers,

AD


>
> -Roel
>
> On 30 jul, 21:40, AD7six <andydawso...@gmail.com> wrote:
>
> > On Jul 30, 9:00 pm, Roel <roel....@gmail.com> wrote:
>
> > > I've tried Containable but it doesn't help lower the number of queries
> > > made. In fact in some circumstances Containable creates unnecessary
> > > queries (https://trac.cakephp.org/ticket/5864).
>
> > > To be clear, I have no trouble getting my data. It's just, from a
> > > perspective of someone who handwritten his MySQL queries, CakePHP
> > > could be much more efficient with its database calls.
>
> > > At points I'm a bit torn between writing an app that prioritizes
> > > efficient database queries or Cake's logic. To illustrate:
>
> > > Option 1:
>
> > > $data = $this->Article->read();
>
> > > <queries made (aside from DESCRIBE): 1 + [num_comments]>
>
> > > Option 2:
>
> > > $this->Article->recursive = -1;
>
> > > $articleData = $this->Article->read();
>
> > > $postData = $this->Article->Comment->find('all', array('conditions' =>
> > > array('Comment.article_id' => $this->Article->id)));
>
> > > <queries made (aside from DESCRIBE): 2)>
>
> > > Option 1 is nice and clean, as you would expect from Cake, but it can
> > > potentially mean a lot of database quering. Option 2 on the other hand
> > > doesn't look as slick. It puts some logic in my controller I don't
> > > want there. The related data is split over 2 variables. But the number
> > > of queries is fixed.
>
> > > I'm just curious if this issue also bothers other developers and what
> > > direction do they choose.
>
> > I'd go with the latter - 2 explicit and simple queries (although I
> > think your 1 + number of comments is dependent on the version of cake
> > you're testing with - should be 2 queries anyway).
> > You could create a model method to encapsulate your two finds (and any
> > other logic therin). and even re arrange the resultant array data such
> > that it's the same as calling find with containable.
>
> > The Linkable (or my own OneQuery) behavior is worth using - although
> > in the use case you're presented it's not relevant.
>
> > AD
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to cake-php+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

No comments: