It’s better to start with an example to illustrate this case. Let’s say we have an User class and it should have an list of Post.
The first thought is to create this list inside the User class, but analyzing the use cases we find out that most of the times we want to retrieve the user without its posts and retrieve the posts without the user. However we need the user ID to retrieve posts. So the other way to create the data model is to not have the associations but create Post indexed by User ID.
In terms of cost, what are the pros and cons of both implementations?
See the billing page, in particular the section on the datastore operations:
https://developers.google.com/appengine/docs/billing
Datastore read costs grow per entity.
Datastore write costs grow per indexed property.
The first method will be much cheaper since it only operates on one User entity, and there’s no indexing required.
However, cost probably isn’t your sole deciding factor. Entities are limited to 1MB each, so if you’re storing your posts within your User entity, you’ll likely run into a wall. Time to read/write entities also depend on size, so large entities will take longer to read/write.