- From: Keean Schupke <keean@fry-it.com>
- Date: Wed, 2 Mar 2011 10:52:29 +0000
- To: Joran Greef <joran@ronomon.com>
- Cc: Jeremy Orlow <jorlow@chromium.org>, public-webapps@w3.org
- Message-ID: <AANLkTimXfE0XewwhJdaBVVnvpZZkEVrH5SWH0WE4kSQu@mail.gmail.com>
If you are operating on indexes then you do not have a 'join' language as you are operating on sets. To have a join you need to be operating on relations. A relation is commonly visualised as a row in a table in a relational database, With IDB this would be the union of all the property-sets of the objects in the index. A complete set of relational operators would be: project restrict rename join union difference In most useful syntaxes you don't need rename as the other methods handle renaming attributes already. Join is traditionally a Cartesian-product, but a natural-join can be substituted without losing completeness. Intersection is not included as it is easily derived from union and (symmetric)difference. Cheers, Keean. On 2 March 2011 06:35, Joran Greef <joran@ronomon.com> wrote: > On 01 Mar 2011, at 7:27 PM, Jeremy Orlow wrote: > > > 1. Be able to put an object and pass an array of index names which must > reference the object. This may remove the need for a complicated indexing > spec (perhaps the reason why this issue has been pushed into the future) and > give developers all the flexibility they need. > > > > You're talking about having multiple entries in a single index that point > towards the same primary key? If so, then I strongly agree, and I think > others agree as well. It's mostly a question of syntax. A while ago we > brainstormed a couple possibilities. I'll try to send out a proposal this > week. I think this + compound keys should probably be our last v1 features > though. (Though they almost certainly won't make Chrome 11 or Firefox 4, > unfortunately, hopefully they'll be done in the next version of each, and > hopefully that release with be fairly soon after for both.) > > Yes, for example this user object { name: "Joran Greef", emails: [" > joran@ronomon.com", "jorangreef@gmail.com"] } with indexes on the "emails" > property, would be found in the "joran@ronomon.com" index as well as in > the "jorangreef@gmail.com" index. > > What I've been thinking though is that the problem even with formally > specifying indexes in advance of object put calls, is that this pushes too > much application model logic into the database layer, making the database > enforce a schema (at least in terms of indexes). Of course IDB facilitates > migrations in the form of setVersion, but most schema migrations are also > coupled with changes to the data itself, and this would still have to be > done by the application in any event. So at the moment IDB takes too much > responsibility on behalf of the application (computing indexes, pre-defined > indexes, pseudo migrations) and not enough responsibility for pure database > operations (index intersections and index unions). > > I would argue that things like migrations and schema's are best handled by > the application, even if this is more work for the application, as most > people will write wrappers for IDB in any event and IDB is supposed to be a > core-level API. The acid-test must be that the database is oblivious to > schemas or anything pre-defined or application-specific (i.e. stateless). > Otherwise IDB risks being a database for newbies who wouldn't use it, and a > database that others would treat as a KV anyway (see MySQL at FriendFeed). > > A suggested interface then for putting or deleting objects, would be: > objectStore.put(object, ["indexname1", "indexname2", "indexname3"]) and then > IDB would need to ensure that the object would be referenced by the given > index names. When removing the object, the application would need to provide > the indexes again (or IDB could keep track of the indexes associated with an > object). > > Using a function to compute indexes would not work as this would entrap > application-specific schema knowledge within the function (which would need > to be persisted) and these may subsequently change in the application, which > would then need a way to modify the function again. The key is that these > things must be stateless. > > The objects must be opaque to IDB (no need for > serialization/deserialization overhead at the DB layer). Things like > key-paths etc. could be removed and the object id just passed in to put or > delete calls. > > > 2. Be able to intersect and union indexes. This covers a tremendous > amount of ground in terms of authorization and filtering. > > > > Our plan was to punt some sort of join language to v2. Could you give a > more concrete proposal for what we'd add? It'd make it easier to see if > it's something realistic for v1 or not. > > If you can perform intersect or union operations (and combinations of > these) on indexes (which are essentially sets or sorted sets), then this > would be the join language. It has the benefit that the interface would then > be described in terms of operations on data structures (set operations on > sets) rather than a custom language which would take longer to spec out. > > I've written databases over append-only files, S3, WebSQL and even > LocalStorage (!) and from what I've found with my own applications, you > could handle everything from multi-tenant authorization to adequate > filtering with the following operations: > > 1. intersect([ index1, index2 ]) > 2. union([ index1, index2 ]) > 3. intersect([ union([ index1, index2 ]), index3, index4, index5, index6, > index7 ]) > > Hopefully, a join language described in terms of pure set operations would > be much simpler to implement and easier to use and reason with. > > In fact I think if IDB offered only a single object store and an indexing > system described above, it would be completely perfect. That's all that's > needed. No need for a V2. Just a focus on high-performance thereafter. > > >
Received on Wednesday, 2 March 2011 10:53:02 UTC