Have you read our documentation on KeyFactory?

http://code.google.com/appengine/docs/java/datastore/relationships.html

<http://code.google.com/appengine/docs/java/datastore/relationships.html>I'd
try to understand what's going on there. It sounds like you're doing it the
right way, but it's up to you to benchmark and find the best approach for
what works for you. The usage characteristics of your application should
determine the way your store your data.

On Wed, Feb 3, 2010 at 3:42 AM, Manny S <manny.m...@gmail.com> wrote:

> Ikai,
> Based on your inputs I created two data classes that have a unidirectional
> one-to-one relationship
> Now, I have two data classes simpledata and detailscol.
> simpledata contains fields A, B, C (and a Key field)
> detailscol just contains field D.
>
> simpledata imports detailscol that contains field D (and a Key field). It
> also contains an accessor for the detailscol.
> Code:
> simpledata sdata = new simpledata(A,B,C);
> sdata.setKey(null);
> detailscol obj = new detailscol(D);
> sdata.setD(obj);
>
> The keys are generated by the application and then I make the data
> persistent.
>
> Now, I display just the data in simpledata and if the user clicks on a
> details link I get the data stored in detailscol
> To get to that data I just do
>
> detailscol d = sdata.getDetails();
>
> Two questions:
>
> 1) Is this the right approach?
>
> 2) If I want to get the child data using just the parent keyhow do I go
> about it?
>
> E.g, user clicks details and I use some AJAX to redirect to a different
> servlet with just parent key as a parameter (since I don't access the child
> object yet). I get the parent key using
> KeyFactory.keyToString(sdata.getKey());
>
> Now, that I have the parent's key should I do a getObjectbyID on the
> parent data again using this and then get the child using the accessor
> method or is there a direct way to construct the child key and get to the
> child data.
>
> Due to the nature of my application I would like to have the key generated
> automatically (using setKey(null)).
>
> Apologies for the confusion in advance :)
>
> Manny
>
>
>
>
>
>
> On Sat, Jan 30, 2010 at 12:16 AM, Ikai L (Google) <ika...@google.com>wrote:
>
>> Hi Manny,
>>
>> A few things to first remember - App Engine's datastore is not a database,
>> but a distributed key value store with additional features. Thus, we should
>> be careful not to frame our thinking in terms of RDBMS schemas. For this
>> reason, I like to avoid using database terminology that can confound the
>> design process like "table" or "column". App Engine stores objects
>> serialized ("entities") and indexes on the values. It'd be similar to an
>> approach of creating a MySQL table with a String ID and a blob value,
>> storing serialized Objects in the blob column, or using Memcache and storing
>> JSON values.
>>
>> When you retrieve a single value from the key value store, we have to
>> retrieve everything at once. In most scenarios, unlike SQL databases you may
>> be used to, retrieving large binary or text data does not add serious
>> overhead. Of course, this changes if you start storing data on the scale of
>> 1mb and are retrieving it unnecessarily. How large is the data you are
>> retrieving?
>>
>> Here's the way I would model your scenario if I was positive the
>> text/binary field had a 1:1 relationship with the parent class:
>>
>> * on your main entity, define the properties.
>> * define a new entity with a text/binary field, and encode the parent key
>> information in this key such that generating the key for this child field is
>> very cheap. KeyFactory.stringToKey and KeyFactory.keyToString are crucial
>> here. Read more about them here:
>> http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory.html.
>> You can call your child property "parent_id:additional_info" or whatever
>> makes sense to you.
>>
>> Robert's solution of using a child key is basically just a variation on
>> this, as parent key information is encoded in a child key.
>>
>> A lot of this stuff can be a bit different to get used to. I suggest
>> becoming familiar with keys and how they are used in App Engine:
>>
>> Basic documentation about relationships:
>> http://code.google.com/appengine/docs/java/datastore/relationships.html
>> A more advanced article:
>> http://code.google.com/appengine/articles/storage_breakdown.html
>>
>>   On Thu, Jan 28, 2010 at 10:28 PM, Manny S <manny.m...@gmail.com> wrote:
>>
>>>   Hi All,
>>>
>>> First off, thanks for your time. A quick noob question on the right way
>>> to model data.
>>>
>>> I have a table with four columns A,B,C, D.  D - the fourth is of type
>>> text (contains quite a bit of data).
>>>
>>> I wanted to ensure that the contents of the details column 'D' is not
>>> fetched during a query. A sample scenario
>>> User does a search. Sees Columns A,B,C. If they need more details for
>>> that particular record Click on a link that fetches D for that particular
>>> record.
>>>
>>> So I tried to do something like - Select A, B, C from tablename.
>>>
>>> I found from the documentation that the GQL query returns full data
>>> objects and so all queries start with SELECT *.  Is this true for JDOQL on
>>> the datastore as well? Does this mean everytime I query the data store its
>>> going to return all columns consuming bandwidth?
>>>
>>> Also since I want the content of COlumn D to be fetched on subsequent
>>> user action so should I instead create two tables one with
>>>
>>> ID_TB1, A, B, C
>>>
>>> and the other one with
>>>
>>> ID, ID_TB1, D?
>>>
>>> Manny
>>>
>>> --
>>> 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-appeng...@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/google-appengine?hl=en.
>>>
>>
>>
>>
>> --
>> Ikai Lan
>> Developer Programs Engineer, Google App Engine
>> http://googleappengine.blogspot.com | http://twitter.com/app_engine
>>
>> --
>>  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-appeng...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
>> .
>> 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-appeng...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>



-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
http://googleappengine.blogspot.com | http://twitter.com/app_engine

-- 
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-appeng...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to