Thanks a bunch Tim for your inputs,

My rationale  for adding the date to the appstore generated key is to make
pagination easier. I would do pagination on the key and not add a separate
column for that. (Pagination by date alone will also not solve my problem
since it can have duplicates and hence couple it with the key)

I understand fetching by keys is much faster. Though I don't see a scenario
where I would have to do that now I would like to architect my app where
that would be possible. However, I do not have anything unique in my record
with which I can set the key. It just contains city name, locality details
and a series of other fields all of which could have duplicates. Any ideas
as to how I can generate unique ids from these or any general pointers
towards generating unique Ids from data where the data itself does not have
a unique field?

Manny

On Thu, Feb 11, 2010 at 4:49 PM, Tim Hoffman <[email protected]> wrote:

> Hi Manny
>
> Do you really want to do that for a key.  One if the big advantages of
> creating your own keys
> is being able to explicitly get entities by key (1 or more with
> db.get(list_of_keys) which is much
> quicker than a gql or filter.  Making your keys include dates mean you
> will be unlikely to
> guess/know what the keys are in advance.
>
> This of course may not be useful for what you are doing, but worth
> keeping in mind.
>
> Rgds
>
> T
>
> On Feb 11, 2:12 pm, Manny S <[email protected]> wrote:
> > Hi Ikai,
> >
> > I did read the documentation and now I have my data structures in place.
> One
> > thing I wanted to do and that was not clear from my previous post was to
> > append a app generated string (not unique) as a prefix to a datastore
> > generated key. For instance, I want to generate a key that has the  date
> (of
> > record creation) as a prefix to the datastore generated unique key.  Is
> > there a way to do this? I do not want my application to generate unique
> Ids.
> >
> > From reading through the literature so far, I am guessing that will not
> be
> > possible since the datastore keys are generated only at the time when the
> > objects are being made persistent.
> >
> > Manny
> >
> > On Wed, Feb 10, 2010 at 3:30 AM, Ikai L (Google) <[email protected]>
> wrote:
> >
> > > 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 <[email protected]> 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) <[email protected]
> >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/appengi....
> > >>> 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 <[email protected]
> >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
> [email protected].
> > >>>> To unsubscribe from this group, send email to
> > >>>> [email protected]<google-appengine%[email protected]>
> <google-appengine%[email protected]<google-appengine%[email protected]>
> >
> > >>>> .
> > >>>> 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
> [email protected].
> > >>> To unsubscribe from this group, send email to
> > >>> [email protected]<google-appengine%[email protected]>
> <google-appengine%[email protected]<google-appengine%[email protected]>
> >
> > >>> .
> > >>> 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
> [email protected].
> > >> To unsubscribe from this group, send email to
> > >> [email protected]<google-appengine%[email protected]>
> <google-appengine%[email protected]<google-appengine%[email protected]>
> >
> > >> .
> > >> 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 [email protected]
> .
> > > To unsubscribe from this group, send email to
> > > [email protected]<google-appengine%[email protected]>
> <google-appengine%[email protected]<google-appengine%[email protected]>
> >
> > > .
> > > 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 [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-appengine%[email protected]>
> .
> 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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to