Two Wednesday back, the App Engine team hosted the latest session of its bimonthly IRC office hours. A transcript of the session and a summary of the topics covered is provided below. The next session will take place this coming Wednesday, February 3rd from 7:00-8:00 p.m. PST in the #appengine channel on irc.freenode.net.
- Jason --SUMMARY----------------------------------------------------------- - Q: Should you split a single entity into two or more entities if one or more properties are updated frequently, e.g. per request? A: No, but if you expect to update a single entity or entity group more than once per second, you should consider sharding to avoid datastore contention (http://code.google.com/appengine/articles/scaling/ contention.html). You generally don't need to split entities, although you can do so to save bandwidth if your entities contain several large properties that only need to be accessed occasionally. [9:01-9:06] - Q: Does the 30-second request deadline applied during Blobstore uploads? A: No. In general, time spent by the user doesn't count towards your execution time limit. [9:07-9:08] - Discussion on the maximum length of task queue parameters. [9:10-9:12] - Discussion on bulkloader dump and restore, whether there are any plans to allow for clearing a single datastore kind only, and whether tasks or remote_api is the best mechanism for clearing the datastore [9:16-9:20, 9:24-9:25] - Q: How can one determine the string-encoded key of a given entity for another application, e.g. when updating foreign keys ahead of a bulk upload to another datastore? A: This could change going forward, but for now you can supply the '_app_id_namespace' argument to db.Key.from_path. Or instead of using string-encoded keys, you can use Key.to_xml which provides a transparent encoding. Bear in mind that App Engine currently doesn't allow for referencing entities in other applications, though this could change in the next release. [9:24-9:25, 9:27-9:28, 9:32, 9:35-9:36] - Discussion on whether, when building a master-detail relationship (e.g. orders and items), it's better to store all order information in a single entity or to use an individual entity for each item in the order. [9:27-9:35] - Q: If you're new to App Engine, which runtime should you start with? A: Pick the runtime language most familiar to you to minimize the amount of new learning that you have to do all at once -- even though many use standard APIs, App Engine's various services will take time to master, especially the datastore. [9:35-9:38] - Q: For list properties, is the name of the property stored for each item (e.g. N times for N items) even when its unindexed? A: Yes -- the datastore is schemaless, so a list foo=[bar,baz] is actually stored as two properties with the same name: foo=bar and foo=baz. Hence, each item in the list requires the name to be stored with it. See the article at http://code.google.com/appengine/articles/storage_breakdown.html which explains exactly what gets stored for all entity and index rows. [9:40-9:43, 9:52-9:56, 9:59-10:01] - Discussion of deferred.defer, its ability to schedule tasks to be executed during off-peak hours, and its relation to the core product. [9:41-9:46, 9:50] --FULL TRANSCRIPT--------------------------------------------------- [09:00am] nickjohnson: Welcome to the fortnightly App Engine developer chat! With me today are Jason and Ikai. [09:00am] nickjohnson: And Ryan [09:00am] ikai_google: Hi everybody! [09:00am] ryan_google: and me! (...something) [09:01am] dennis_tw: I have a question about entities that are changed often (eg: changed on every user action. Like modification time or view count). I'm thinking of separating them out into a separate entity so that that 'high frequency' entity is small and can be moved between the datastore and my app with little overhead. Is that a reasonable entity design? [09:01am] ikai_google: *crickets* [09:02am] nickjohnson: dennis_tw: Optimising to minimize the amount of unwanted data you're moving is a good idea. It doesn't have to relate specifically to how frequently it's updated, though. [09:02am] mcrady: any plans to support stretching of images? [09:02am] ikai_google: dennis_tw: In the past, even outside of App Engine, I've used a design where I do frequent writes to MemCache and flush. Of course, you run the risk of some data loss [09:03am] dennis_tw: cool [09:03am] dennis_tw: I'm also wondering if 'small entities' and 'medium sized entities' have pretty much the same overhead. At what point does it become irrelevant how small the entity is? is there a minimum transfer size? [09:03am] ikai_google: mcrady: Do you mean resizing to a larger image? [09:03am] ryan_google: +1 to ikai and nick's points. i'd also note that entity size, in bytes or number of properties or whatever, generally doesn't matter in these cases, but you definitely want to take chances to coalesce, shard, etc to avoid writing to a single entity (or group) too often [09:03am] nickjohnson: There's no 'minimum transfer size'. Cost is roughly linear with entity size. [09:04am] nickjohnson: Well, it's polynomial, but that's one of the factors. [09:04am] mcrady: no, resizing in one dimension [09:04am] ryan_google: dennis: you mean in bytes, right? [09:05am] dennis_tw: well, i can move all my dymanic stuff into a smalll dynamic entity. or i can just put everything in 1 entity and it's not that much bigger. so wondering if it will really make a different (and at what point it will make a difference) [09:05am] ikai_google: mcrady: I'm not aware of any changes coming to the Images API, but please add it to the issues list [09:05am] ikai_google: mcrady: http://code.google.com/p/googleappengine/issues/list [09:06am] mcrady: ok, the image api could really use some attention in general [09:06am] ryan_google: dennis: again, what do you mean by "small" and "bigger." total size in bytes? number of properties? number of property values? ... [09:06am] nickjohnson: dennis_tw: Generally I would only worry if there's a large number of properties, or a very large quantity of data that you're fetching and don't need. [09:07am] mcrady: the 30 second timeout doesn't apply to blobstore timeouts, right? Is there any timeout at all on the blobstore upload? [09:07am] mcrady: blobstore timeouts -> blobstore uploads [09:08am] ryan_google: mcrady: afaik no there's no timeout [09:08am] nickjohnson: mcrady: For uploads and downloads in general, time spent by the user doesn't count towards your execution time limit [09:10am] lent: a question in regards to task queues, what is the maximum length that I can pass through as a parameter (for a POST) after which I would have to switch over to using payload? [09:10am] nickjohnson: lent: Roughly 10k [09:10am] nickjohnson: The exact limit in bytes varies a little bit with other parameters, so if you anticipate hitting the limit, a try/ catch may be your best bet. That's the approach deferred takes. [09:11am] gQuash: I arrived late again :( [09:11am] lent: nickjohnson: isn't 10k the total limit? I can pass a 10k string as single parameter? [09:12am] moraes: gQuash, no you're in time! [09:12am] nickjohnson: gQuash: You haven't missed much yet, and the transcript will be up later. [09:12am] gQuash: [09:12am] gQuash: awesome !!!! [09:12am] • moraes waves at gQuash [09:12am] nickjohnson: lent: Yes, 10k is the total limit. If you're letting the task queue lib do your encoding for you, then 10k is the limit on the url encoded string. [09:13am] nickjohnson: gQuash: Any questions, or are you here to spectate? [09:14am] moraes: i'm excited about http://code.google.com/events/io/2010/sessions/next-gen-queries-appengine.html [09:14am] moraes: this is not a question. [09:14am] ryan_google: [09:14am] ryan_google: thanks moraes! we are too [09:14am] ikai_google: moraes: so am I [09:15am] gQuash: nickjohnson: I was really ansious to spectate awesome conversations (I'm not that smart to ask question, preffer to read) [09:15am] ikai_google: Hey Ryan, care to give us a preview? [09:15am] ryan_google: actually alfred's giving it, not me [09:16am] ryan_google: (alfred fuller; he's new to the datastore team since last i/o) [09:16am] moraes: "various features", aka cursors! [09:16am] lent: a question about backing and restore. The bulkloader dump and restore provides the basic dump and restore but in order to restore to the dumped state, the database has to be cleared out. Is there any plan to offer an operation which will clear out a database or a particular kind? [09:16am] ryan_google: heh. cursors are actually much sooner. we don't consider them next gen any more. the talk will be much more exotic. [09:16am] nickjohnson: lent: You don't have to clear the datastore - entities from the dump will simply overwrite existing ones. [09:16am] moraes: great, heh [09:17am] nickjohnson: As far as bulk delete goes, the task queue is your friend here. I've been planning to write a more robust mapping framework for this sort of task, but it's something anyone with sufficient determination could write. [09:17am] lent: nickjohnson: yes, but there are entities which may have been created after the dump which if left will lead to an inconsistent state [09:18am] nickjohnson: lent: Quite true [09:19am] ikai_google: lent: Yep, but that's a problem with any date migration [09:19am] ikai_google: lent: *data [09:19am] ryan_google: lent: we've had some thoughts about this for a while, including doing it at the bigtable level, we just haven't been able to prioritize it yet [09:19am] ryan_google: (fair warning all, "priorities" is kind of my answer to everything) [09:20am] gQuash: hahaha [09:20am] lent: nickjohnson: is bulk delete possible to do through remote_api or is the simpler way to just do it programatically through tasks [09:20am] ikai_google: lent: The solutions aren't great, either, MySQL's built in dumping mechanism locks the entire table ... it's a bit more difficult with our distributed store [09:20am] nickjohnson: lent: You can do it via remote_api, but doing it via tasks will use less quota and be faster. [09:22am] mcrady: I'm unable to create an embedded class that contains a collection. Is that a known issue? [09:22am] mcrady: embedded jdo class [09:22am] ryan_google: mcrady: is that an app engine specific q? do you mean, in JDO or JPA? [09:23am] ryan_google: ah [09:23am] ikai_google: mcrady: What is it a collection of? [09:23am] mcrady: even an arraylist doesn't seem to work [09:24am] ikai_google: mcrady: Hrm ... can you post a test case to the groups? [09:24am] lent: in some cases, we want to restore a dump to a different application and we have been using String encoded Key value as foreign keys in some of our kinds and we're running into a problem of the String encoded Key value being different in a different application. Is there any way to compute what the String encoded Key value would be in a different application id so that we can patch the dump file before restoring? [09:24am] mcrady: yes, sounds good [09:24am] ikai_google: mcrady: As well as the exact error? I know there are limitations to storing embedded classes. Whether we've done a good job documenting them is a different question [09:25am] nickjohnson: lent: Yes, just supply the '_app_id_namespace' argument to db.Key.from_path. Bear in mind that this is an implementation detail, though, so could change. [09:26am] lent: nickjohnson: what's the equivalent of that in Java? [09:27am] dennis_tw: got another data modeling question: i have a 'master-detail' type of relationship (like orders and order details). in a relational model, i would separate the details into a different table. but for gae, i'm thinking of putting everything in 1 entity (this will reduce the chance of a timeout since there is 1 entity instead of N). does this seem reasonable? have others done this? [09:27am] ryan_google: lent: an alternative would be to use Key.ToXml instead of converting it to a string, since that encoding is transparent, not opaque [09:27am] ryan_google: (maybe to_xml, not sure if we got that alias right) [09:27am] nickjohnson: ryan_google: He wants to use them as key names, though, and xml is probably a bit verbose for that. [09:27am] ikai_google: dennis_tw: Should be fine either way [09:28am] ikai_google: dennis_tw: If you split into 2 entities, you'd do 2 retrieve by keys (you would encode OrderDetails key to be generatable from Order's key). With one entity you do a single retrieve [09:28am] ikai_google: dennis_tw: Between 1 and 2 ... there isn't a whole lot of difference. [09:28am] ryan_google: nickjohnson: eh if it's just the key, they probably end up pretty similar lengths (sigh) [09:28am] ryan_google: lent: do reference properties not work? do we complain if you try to store a reference property to another app id? [09:29am] dennis_tw: actually, it's 1 vs (1+N) for N details [09:29am] ryan_google: i remember writing code for that recently, we may or may not allow it. if we don't, we actually might in 1.3.1. [09:29am] ryan_google: (we don't talk about it much though since it's such an unusual use case) [09:29am] ikai_google: dennis_tw: What's the order of N? 10? 100? 1000? [09:29am] dennis_tw: between 10 and 100 [09:29am] gQuash: did you code appengine on python ? [09:30am] Wooble: ryan_google: you might allow referencing entities owned by another application?? [09:30am] ryan_google: qQuash: there are lots of different parts in different languages: python, java, and c++ [09:30am] nickjohnson: Some of us wrote some of it. None of us wrote all of it. [09:31am] dennis_tw: this is one dimension of what i was eluding to before: are lots of small entities OK or better to pack them myself? [09:31am] ryan_google: nickjohnson: actually i wrote all of it. little known piece of trivia. [09:31am] nickjohnson: ryan_google: Even the small bits I wrote? [09:31am] ryan_google: Wooble: not sure if we do or not now. i know how to find out though. just a sec... [09:31am] ryan_google: nickjohnson: yup. like i said, little known. fortunately i'm modest! [09:31am] nickjohnson: ryan_google: indeed! [09:31am] ikai_google: dennis_tw: My suspicion is that the best design require some amount of moving away from normalization way of thinking [09:31am] gQuash: you love python ... [09:31am] ikai_google: dennis_tw: That is, you store most of the data you need in Order. Calculate sums, averages at write time [09:32am] lent: ryan_google: by reference properties, do you mean those determined through ownership (I'm using java)? I'm using java and those properties which are annoted as being keys or parent values do work, but where we just have arbitrary references in String fields to other keys, don't work because restore doesn't know that it is an encoded Key. [09:32am] ikai_google: dennis_tw: OrderDetails can be an additional entity type which you only retrieve when you really, really need [09:32am] ryan_google: dennis: ikai's rule of thumb is right. as for the q of one vs many, it depends on more info than we have. there's no single right answer. [09:33am] laheadle: what's the recommended way to enable eclipse to show me javadoc info about javax.jdo classes like PersistenceManager? [09:33am] ristoh1: when I do datastore get with get_by_key_name (multiple_keys), does that show up a single get or multiple gets? [09:33am] dennis_tw: yup, i'm trying to get a feel for gae data modeling. my current impression is that i should pack everything into 1 entity unless i want to index that data separately [09:33am] ryan_google: lent: probably ownership, yes. sorry, i'm not an expert on the java api. but yes, if you store encoded keys as straight strings, then we don't know to do anything special with them. [09:33am] nickjohnson: ristoh1: It does a single get on the backend [09:34am] nickjohnson: ristoh1: It's syntactic sugar, basically [09:34am] ristoh1: so, no need to run it inside transaction? [09:34am] ryan_google: dennis_tw: again, there's no single answer for all cases [09:35am] nickjohnson: ristoh1: Gets for multiple entity groups aren't transactional regardless of how you do them. [09:35am] ikai_google: dennis_tw: there's an advantage to using a single entity: you can do transactional things without mucking with keys and such. I think the jury is still out on "best practices with NoSQL" [09:35am] dennis_tw: good point [09:35am] gQuash: any recommended software technique to develop an app on GAE ? [09:35am] ikai_google: dennis_tw: er, mucking with keys, entity groups, etc [09:35am] ikai_google: gQuash: Java [09:35am] ryan_google: ok, so, we don't currently let you use reference properties that point to other app ids. from http://shell.appspot.com/ : [09:35am] ryan_google: >>> class Foo(db.Expando): [09:35am] ryan_google: x=db.ReferenceProperty() [09:35am] ryan_google: >>> Foo(x=db.Key.from_path('Foo', 1, _app_id_namespace='asdf')).save() [09:35am] ryan_google: Traceback (most recent call last): [09:35am] ryan_google: File "/base/data/home/apps/shell/ 1.335852500710379686/shell.py", line 267, in get [09:35am] ryan_google: exec compiled in statement_module.__dict__ [09:35am] ikai_google: gQuash: kidding! that's a really general question [09:35am] ryan_google: File "<string>", line 1, in <module> [09:35am] ryan_google: File "/base/python_lib/versions/1/google/ appengine/ext/db/__init__.py", line 797, in put [09:35am] ryan_google: return datastore.Put(self._entity) [09:35am] ryan_google: File "/base/python_lib/versions/1/google/ appengine/api/datastore.py", line 203, in Put [09:35am] ristoh1: nickjohnson: thanks! that explains my headache over the last few hours [09:35am] ryan_google: raise _ToDatastoreError(err) [09:36am] ryan_google: BadRequestError: app shell cannot access app asdf's data [09:36am] ryan_google: that *might* change in 1.3.1 but no promises [09:36am] gQuash: ikai_google: I love java ... likes python but don't know [09:36am] gQuash: I know its general... but which techinique you recommend ? [09:36am] nickjohnson: ristoh1: What are you doing that makes it important it be transactional? [09:36am] ryan_google: qQuash: definitely start with java then. learning one new thing at a time is generally a good idea, and app engine will be a new thing [09:36am] ryan_google: qQuash: we don't understand the question. what do you mean by "technique"? [09:37am] ikai_google: gQuash: When you're learning App Engine I have come to the conclusion that Python is easier [09:37am] Wooble: "write lots of bad code, then debug it until it works." [09:37am] gQuash: ryan_google: software engineering [09:37am] laheadle: When is 1.3.1 due out and is there a list available of features expected in it? [09:37am] ikai_google: gQuash: If you are new to Java, you are learning App Engine, JDO, JPA, Servlets, JUnit, crazy Java stuff [09:37am] gQuash: well ... I use GAE + GWT and I love it ... [09:38am] laheadle: qQuash me too. rock! [09:38am] gQuash: Yeap ... all that stuff ... so I get quite lost sometimes ! [09:38am] laheadle: qQuash what are you doing for serializing appengine objects over the wire to gwt? gilead? [09:39am] ristoh1: nickjohnson: I'm trying to map some many:many and 1:many relationships over some datasets with taskqueue, and trying to find ways optimize my task [09:39am] gQuash: I'm not advanced programmer ... just try GAE examples to few stuffs. That's why I'm here ... seeing what does people does.. [09:39am] nickjohnson: ristoh1: ah. Well, batching is always a good start [09:39am] johnvdenley: Wooble: thats what ive had to do! not clever, but it works! [09:40am] dennis_tw: another data modeling Q: list properties that are not indexed: is the property name stored for each list instance? would be kind of a waste but there might be some reason for it. if so, i should pack the data myself. [09:40am] ristoh1: nickjohnson: any pointers to perhaps a good blog article that covers something like that? [09:40am] ikai_google: dennis_tw: Yes, but it's Protobuf so it's ... semi-efficient [09:40am] dennis_tw: nice [09:40am] nickjohnson: ristoh1: I'm not quite sure what you're doing, so not really, no. [09:41am] gQuash: do you have any other language in mind for GAE ? [09:41am] ikai_google: dennis_tw: At any rate, I don't feel like the savings you'd get from doing so are worth the tradeoffs in time taken away from writing your application [09:41am] ikai_google: gQuash: I am partial to Scala. [09:41am] johnvdenley: do we have any news on the defer.deferrable thing? i need to programatically schedule tasks to be executed overnight and ive not found any obvious way to achieve this yet (though its possible im just being a newbie again!) [09:41am] nickjohnson: dennis_tw: Yes, they are stored for each instance - a list property is just a'multiply valued' property - one that appears multiple times in the entity [09:41am] ikai_google: gQuash: Groovy is also popular [09:41am] ryan_google: qQuash: new languages aren't a priority for us right now. we're excited about JVM-based languages though! [09:41am] dennis_tw: oops, did you mean that the prop name is stored N times?? [09:41am] ryan_google: scala, groovy, and ruby in particular, at least internally [09:41am] nickjohnson: johnvdenley: What specifically about deferred.defer? [09:41am] ryan_google: dennis_tw: http://code.google.com/appengine/articles/storage_breakdown.html [09:42am] nickjohnson: johnvdenley: You can use it for exactly that [09:42am] nickjohnson: dennis_tw: yes [09:42am] ryan_google: ristoh1: yes, lots. try http://code.google.com/appengine/articles/modeling.html among others [09:42am] ryan_google: also a few i/o talks [09:42am] gQuash: ryan_google: You have sorte really well your priorities that's great hahaha [09:42am] dennis_tw: yup, i looked at that article. and, wow, stored N times... hmmm [09:42am] gQuash: sorted* [09:43am] ryan_google: dennis_tw: it was a space/performance/cost/etc tradeoff [09:43am] ryan_google: gotta love tradeoffs! [09:43am] ryan_google: imho we're actually incredibly cost competitive on storage space [09:43am] dennis_tw: it's fine. just good for us developers to know. [09:43am] ikai_google: dennis_tw: Yeah, I wouldn't optimize for storage [09:43am] ryan_google: the datastore is comparable to (e.g.) amazon simpledb, but at 1/10th of the price [09:43am] johnvdenley: i meant about bringing deferred.defer into the core product [09:43am] ikai_google: dennis_tw: Your indexes are going to take up so much more space [09:44am] dennis_tw: i'm going to use store IDs only, not paths so i'm hoping indexes will be smaller [09:44am] gQuash: what about more examples for java in GAE examples gallery ? [09:44am] nickjohnson: ryan_google: And with a much better type model [09:45am] nickjohnson: johnvdenley: I'm not sure how much more part of the core product it could be? [09:45am] nickjohnson: It's as much so as, say, remote_api, or ext.db. [09:45am] ikai_google: gQuash: We could probably do a better job of surfacing and organizing this page http://groups.google.com/group/google-appengine/web/google-app-engine-open-source-projects [09:45am] ikai_google: gQuash: I've found that one of the best ways to learn is to study and contribute to open source [09:45am] johnvdenley: nickjohnson: perhaps im being a newbie again then, or perhaps its in python, but not java? [09:46am] lent: any longer term plans to offer an option to use a more conventional (relational) database in addition to one that's based on BigTable? [09:46am] nickjohnson: johnvdenley: That's true. There's a patch from an external contributor pending for a Java version, though naturally it can't operate in exactly the same manner. [09:46am] schuey: nickjohnson: i also want a better deferred.defer, or at least a longer timeout on background processes that are processing large amounts of data. [09:46am] gQuash: ikai_google: I didn't know about that page. Thanks !!! ... and I agree with you. Open Source it's really great way [09:46am] nickjohnson: schuey: The 30 second request timeout is independent of deferred, or any other library. [09:47am] ikai_google: gQuash: I'm also going to take this time to talk about how AWESOME Github is [09:47am] • nickjohnson gasps in mock horror at ikai_google [09:47am] schuey: nickjohnson: so there are no plans to extend that time? [09:47am] gQuash: ikai_google: I'll be there reading ... haha. Need too many things to learn [09:47am] ikai_google: gQuash: We get so many requests from people whose computers crash and they ask us if we can help them download their code from appspot ... and the answer is no. So ... use source control [09:47am] nickjohnson: schuey: I couldn't say. I'm just pointing out that it's not related specifically to the deferred library. [09:48am] gQuash: ikai_google: I have my full eclipse GAE +GWT + VISUALIZATION API on an USB stick... I'll die if get lost [09:48am] ryan_google: [ikai_google has been removed by the google brand police, who would like to reaffirm that google code project hosting is a very very good product.] [09:48am] ryan_google: [...very.] [09:49am] ryan_google: [(very)] [09:49am] gQuash: *veeeeeery* [09:49am] gQuash: haha [09:50am] johnvdenley: nickjohnson, ah, yes, so thats my issue, i dont know python at all, so i dont know how it works there or why it "naturally cant operate in exactly the same manner" but yes i can see your reply on the 26th November in the groups conversation, hence my question for an update [09:50am] ikai_google: HAHAHA [09:50am] ikai_google: learning Mercurial has been on my "to do" list [09:50am] ryan_google: wait i thought that guy was gone [09:50am] ikai_google: after using Git, you go back to SVN and go man, this sucks [09:50am] ryan_google: they're letting anyone in here these days [09:50am] • ikai_google is back with a VENGEANCE [09:50am] gQuash: hahaha ... [09:50am] • ryan_google cowers [09:51am] gQuash: preffer code hosting... it's easier for newbies [09:51am] gQuash: like me [09:51am] johnvdenley: @ryan_google... ooo, i think ill look into google code project hosting [09:52am] ikai_google: quick poll here (to fill the dead air): what kind of source control is everyone using here? what's your favorite? [09:52am] ikai_google: <--- Perforce. Git [09:52am] moraes: <- hg [09:52am] nickjohnson: Perforce because I need to, Git because I want to. [09:52am] Wooble: svn, occasionally cvs on local machine [09:52am] dennis_tw: i'm still a bit taken back about the list properties names being stored N times: did you guys mean that for INDEXED list properties that's true. If my list props are not indexed then the names are stored N times?? [09:52am] ryan_google: ikai_google: <-- svn. or rsync. [09:53am] ikai_google: hahaha rsync [09:53am] moraes: please people, you can use git, but stop using that damn slow and unreliable github. [09:53am] moraes: [09:53am] ikai_google: dennis_tw: Nope, each property is stored, but it's stored as a protobuff [09:53am] ikai_google: dennis_tw: The reason is that the datastore is typeless [09:53am] ikai_google: dennis_tw: Err not typeless, schemaless [09:53am] gQuash: <--- google code hosting ? hahaha [09:54am] dennis_tw: so it does not know about lists either ... it's just a list of properties [09:54am] nickjohnson: dennis_tw: Check out the article linked earlier on how the datastore storage works. A list foo=[bar,baz] is exactly identical to two properties foo=bar,foo=baz. [09:54am] ikai_google: dennis_tw: So one entity could have a list property named "skills" and another named "experience" [09:54am] dennis_tw: ok, just wanted to make sure i heard right, even for non-indexed properties [09:55am] lent: any longer term plans to offer a more conventional (relational) database in addition to one based on BigTable? That would open up a large market for you. [09:55am] ikai_google: dennis_tw: It's one of the tradeoffs of storing data in a schemaless key value store [09:55am] dennis_tw: got it [09:56am] dennis_tw: actually, packing and unpacking myself is not a big deal. [09:56am] ryan_google: lent: there's definitely been lots of discussion about that externally at least, and we're paying attention. we're very aware that lots of people don't really need to scale, e.g. internal apps for SMBs, but they do want more of the power of an RDBMS. the core app engine team is focused on app engine itself, but it's definitely on our radar. [09:56am] ikai_google: dennis_tw: This is semi related. But it shows the challenges of using a K/V store http://bret.appspot.com/entry/how-friendfeed-uses-mysql [09:57am] gQuash: not a priority [09:57am] gQuash: hehe [09:57am] dennis_tw: cool, i like bret's stuff [09:59am] ikai_google: dennis_tw: Anyway, if I were you I wouldn't bother saving that space [09:59am] ryan_google: +1! [09:59am] dennis_tw: yeah, indexes will use most space, right? [10:00am] ikai_google: dennis_tw: Even without indexes I'm willing to bet your time implementing and debugging > storage space $ [10:01am] ikai_google: dennis_tw: Your time is valuable to us [10:01am] ryan_google: +2 [10:01am] ikai_google: And hey! That's the end of our office hours this time [10:01am] dennis_tw: makes sense. but it's good to know by having these chats! thx! [10:01am] ikai_google: We'll have office hours again in 2 weeks. Join our Google Groups! Follow us on Twitter! http://www.twitter.com/app_engine -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.