Subject: Re: [google-appengine] Understanding "The App Engine Way"
In general, the 'appengine way' is *definitely* to create fewer, fatter
entities. Denormalization is the way of things. Because GAE is
schemaless, it's relatively easy to store an entire entity graph in a
single entity.

Also, the 'appengine way' is to precalculate aggregations rather than
computing them at runtime.

Your pre-calculated Nav tree is probably the solution I would use, caching
the entity in memcache for performance.

Jeff

On Wed, Feb 22, 2012 at 9:08 AM, adamd <adambones@xxxxxxxxx> wrote:

> Hi all
>
> I'm testing the waters with App Engine (Java) and wondered if anyone
> could help with my understanding of the "app engine way of doing
> things" with regards to queries and efficiency.
>
> Essentially my question is this: given that AE charges for each query
> made, and not for CPU usage, isn't it better to serialize and pack
> your data in to fewer, larger entities than to follow the standard
> data modeling approach of giving each business object it's own table
> row?
>
> Lets say I have a website with 100 pages. For each page served, I need
> to render a navigation tree of links requiring page names, their URLs,
> and their position in the tree. So say I request a level 3 page in the
> tree like "Page 1 > Page 1.2 > Page 1.2.3", I need all names and urls
> for all pages at levels 1,2 and 3.
>
> A conventional approach would be to have a Page table, with properties
> for "name" and "path" (containing the position of the page in the
> tree). When a page is requested, I then need to look it up, find out
> it's path, and then request all other pages that will be shown in the
> navigation according to that path.
>
> Translating this to app engine, I would need to run a query like
> "path" IN [level_1_path, level_2_path, level_3_path], which I have
> learned in reality boils down to a separate query for each tree level.
>
> (side note: I know that using AE's built in ancestor hierchary makes
> queries faster, but Entities can't be moved after being assigned a
> parent, and this is a feature i need. So I believe I need to manage by
> own tree the "path" property, which would look something like "1.2.3")
>
> So the conventional wisdom of building a single big query to do
> everything you want being the most efficient thing you can do doesn't
> seem to apply.
>
> Alternative approach: have a single "site" Entity with a property in
> which I would store a big HashMap containing all the essential page
> information. This can be serialized and compressed and stored as a
> String. Each request then only needs to load this one Entity for the
> purpose of building the nav.
>
> In the conventional setup, this wouldn't be as efficient because it
> would probably be faster to run the big query than to load and
> unserialize the hash map data for every request. But since I'm being
> billed for queries and not CPU usage on AE, is this not the better
> approach?
>
> Or can anyone suggest a better one?
>
> Many thanks for your time
>
> Adam
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To post to this group, send email to google-appengine@xxxxxxxxxxxxxxxxx
> To unsubscribe from this group, send email to
> google-appengine+unsubscribe@xxxxxxxxxxxxxxxxx
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>
>

--
You received this message because you are subscribed to the Google Groups
"Google App Engine" group.
To post to this group, send email to google-appengine@xxxxxxxxxxxxxxxxx
To unsubscribe from this group, send email to
google-appengine+unsubscribe@xxxxxxxxxxxxxxxxx
For more options, visit this group at
http://groups.google.com/group/google-appengine?hl=en.

(C)2011 mailinglist-archive.com