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) <ika...@google.com> 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 <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<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. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.