samskivert
samskivert » 2009 » September

September 30, 2009

A Relational Model of Data for Large Shared Data Banks – Codd

Summary
Limitations of existing data storage systems, especially their tendency to conflate data storage representation with the mechanism by which data is accessed. Specifically: ordering dependence, indexing dependence, access path dependence. Introduction of the relational model, primary keys, normal form and a normalization process. Description of a universal data sublanguage for querying, updating and deleting data. No specific syntax proposed. Definition of expressible, named and stored relations. Hints at the complexity of translating a query on a named relation into efficient operations on a stored relation (cue decades of research on query planning). Defines operations on relations: permutation, projection, join (cyclic and linear; natural), composition, restriction. Redundancy in relations, strong and weak. Consistency of the data set, and rudimentary strategies for checking and enforcing it.

Comments
Given that this was the paper that introduced the relational database, it clearly had some impact. Reading a paper that calls collections of data a data bank and still puts a space between data and base fills one with a sense of anachronism and reverence. That said, it is interesting to consider what stuck and what didn’t.

He makes a big deal about relations containing no duplicates and removing duplicate rows in projections and joins. As far as I know modern databases don’t do this. They assume that if you have duplicate rows, you probably care about it or you’ll supply a distinct clause.

Also interesting is the frequent reference to inferential databases (or rather repeated reminders that his proposal is only appropriate for non-inferential databases). The term doesn’t seem to be widely used today but I can only assume he was referring to databases that actually drew inferences from their data and presumably contained logical propositions in addition to facts.

When defining his universal data sublanguage, he mentions a host language and the data sublanguage. This made me immediately think that he had postulated something like LINQ way back in 1969. However, that turned out not to be the case. I’m not 100% clear on what he did mean exactly, but it appears to be more like the distinction between PLSQL and ANSI SQL. The host language might contain hints on how to physically store the data and it would provide a library of functions that could be called by the data sublanguage (his example is arithmetic operators).

He discusses compositions at length, a composition being basically a join with the join columns removed (I could be wrong about this). Given that one nearly never wants to do that, it was not clear why he spent time discussing it, but I think it’s just a useful operation when proving other things about relations. He specifically mentions it later when talking about validating consistency. Similarly, restriction looks an awful lot like a natural join against a table whose columns are precisely the join columns and nothing more. Again, probably just useful for proofs.

His discussion of redundancy also seems not to have born fruit. Strict redundancy would indicate that under the hood, you could avoid storing some data. An explanatory example would be: you declare a table T1 with (A, B), T2 with (B, C) and T3 with (A, C). If T1.A and T1.B are primary keys and T1.B is a foreign key (or for whatever reason you are guaranteed that there is an exact one to one correspondence between T1.B and T2.B) then T3 can be completely derived from a join on (A, B) and (B, C) — it is in fact a composition as I mentioned above, join and drop the join columns. So a smart database could not store anything on the file system for the (A, C) mapping. However, I don’t know that any database actually does this. By his own admission you can never actually do anything about weak redundancy (it would be like strong redundancy but without the guarantee that T1.B and T2.B are in one-to-one correspondence), so it’s not super interesting.

Finally his coverage of consistency seems pretty loosey-goosey in this world of ACID compliant databases. But I have to remember that transactions had not yet been invented. Also his examples all seemed to portray a world where the database was a giant mainframe with numerous terminals where people were running queries against the database and manually updating and deleting data therein, so preventing all those people from introducing inconsistencies must have seemed like a major challenge.

I doubt all of my paper reviews will be this thorough, but I’ll aim to maintain my current enthusiasm level for as long as possible.

Source: PDF ACM

Posted to papers by mdb at 9:29 pm | Comments (0)       

Papers please

Part of the joy of being a grad student involves reading countless academic papers and in many cases generating summaries and commentary. This is done for one’s own comprehension and memory or as part of a fun game one plays with one’s instructor where they require summaries to ensure that you’ve read the papers in time to participate in their discussion.

I’m chiefly interested in the former benefit, and because it may be of some marginal interest to the small group of readers of this blog, I’ve decided to post those summaries and commentary here. Hopefully my naive initial forays into commentary and analysis will grow, in the fullness of time, into brilliant snapshots that reach right into the heart of each paper and highlight the intellectual core of the work, its impact and its potential. One likes to have goals.

Posted to papers by mdb at 5:19 pm | Comments (0)       

September 23, 2009

The Housekeeper and the Professor

A poignant story about a housekeeper, her son and a professor of mathematics who can no longer form long-term memories. It’s told with a quiet poetry and an enthusiasm for math and baseball. I couldn’t help thinking frequently about what it would be like to be on either side of that equation.

Posted to books by mdb at 12:54 pm | Comments (0)       

September 22, 2009

Pike Place

I moved to Seattle and have a new place to live. Check out the pictures.

Posted to ramble by mdb at 7:27 pm | Comments (0)       

September 21, 2009

The Logic of Life

A consistently readable, but only mostly consistently convincing book about rationality and human nature. Some of his arguments stretch a bit thin, but I have to admit that his rational interpretation of the world resonates with my own biases. Even where I feel that he’s over extending, I find myself wanting to believe him. I’ll conveniently ignore the irrationality of this, lest it undermine his thesis and ruin the fun for everyone.

Posted to books by mdb at 9:37 am | Comments (0)       

September 20, 2009

Why am I surprised?

I go to set up my My Qwest account page for my glorious new phone service and when I click “Create account” after typing in a bunch of annoying crap, it gives me a page that says “Oh, sorry, our shit is down right now. Try again later.” (I’m paraphrasing.) I try again a few minutes later and it claims that my username already exits. Awesome.

My account must already be created, so I try logging in and get:

Sorry, there was an Error
Found in: /profile/pageFlows/profileValidation/ProfileValidationController.jpf

The source of this error is:
Developer: Please check tag attributes and closing tags. Be careful of reserved words

[View Error]  [Close]

com.bea.portlet.adapter.scopedcontent.ActionLookupFailedException: javax.servlet.ServletException
 at com.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.executeAction(ScopedContentCommonSupport.java:699)
 at com.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.renderInternal(ScopedContentCommonSupport.java:268)
 at com.bea.portlet.adapter.scopedcontent.PageFlowStubImpl.render(PageFlowStubImpl.java:136)
 at com.bea.netuix.servlets.controls.content.NetuiContent.preRender(NetuiContent.java:288)
 at com.bea.netuix.nf.ControlLifecycle$6.visit(ControlLifecycle.java:427)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:708)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:720)
 at com.bea.netuix.nf.ControlTreeWalker.walk(ControlTreeWalker.java:183)
 at com.bea.netuix.nf.Lifecycle.processLifecycles(Lifecycle.java:361)
 at com.bea.netuix.nf.Lifecycle.processLifecycles(Lifecycle.java:339)
 at com.bea.netuix.nf.Lifecycle.runOutbound(Lifecycle.java:186)
 at com.bea.netuix.nf.Lifecycle.run(Lifecycle.java:140)
 at com.bea.netuix.servlets.manager.UIServlet.runLifecycle(UIServlet.java:370)
 at com.bea.netuix.servlets.manager.UIServlet.processControlTree(UIServlet.java:256)
 at com.bea.netuix.servlets.manager.PortalServlet.service(PortalServlet.java:779)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
 at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
 at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
 at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
 at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
 at master.com.qwest.filters.PrimaryServletFilter.doFilter(PrimaryServletFilter.java:149)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
 at master.com.qwest.filters.log.TeaLeafServletFilter.doFilter(TeaLeafServletFilter.java:78)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
 at com.bea.p13n.servlets.PortalServletFilter.doFilter(PortalServletFilter.java:251)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
 at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3229)
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
 at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2002)
 at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1908)
 at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1362)
 at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
 at weblogic.work.ExecuteThread.run(ExecuteThread.java:181) Caused by: javax.servlet.ServletException
 at org.apache.beehive.netui.util.internal.ServletUtils.throwServletException(ServletUtils.java:164)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor.processInternal(PageFlowRequestProcessor.java:580)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor.process(PageFlowRequestProcessor.java:851)
 at org.apache.beehive.netui.pageflow.AutoRegisterActionServlet.process(AutoRegisterActionServlet.java:630)
 at org.apache.beehive.netui.pageflow.PageFlowActionServlet.process(PageFlowActionServlet.java:157)
 at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
 at org.apache.beehive.netui.pageflow.PageFlowUtils.strutsLookup(PageFlowUtils.java:1169)
 at org.apache.beehive.netui.pageflow.PageFlowUtils.strutsLookup(PageFlowUtils.java:1200)
 at com.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.executeAction(ScopedContentCommonSupport.java:688)
... 55 more
Caused by: java.lang.NullPointerException
 at com.qwest.commons.utilities.AccountInfoHelper.createAccountInfo(AccountInfoHelper.java:72)
 at com.qwest.commons.controls.ProfileLoginManagerImpl.getAccountInfo(ProfileLoginManagerImpl.java:254)
 at com.qwest.commons.controls.ProfileLoginManagerImpl.getNextFailure(ProfileLoginManagerImpl.java:372)
 at com.qwest.commons.controls.ProfileLoginManagerImpl.validateProfile(ProfileLoginManagerImpl.java:190)
 at com.qwest.commons.controls.ProfileLoginManagerBean.validateProfile(ProfileLoginManagerBean.java:164)
 at profile.pageFlows.profileValidation.ProfileValidationController.validateProfile(ProfileValidationController.java:225)
 at sun.reflect.GeneratedMethodAccessor1294.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.apache.beehive.netui.pageflow.FlowController.invokeActionMethod(FlowController.java:869)
 at org.apache.beehive.netui.pageflow.PageFlowController.internalExecute(PageFlowController.java:305)
 at org.apache.beehive.netui.pageflow.internal.FlowControllerAction.execute(FlowControllerAction.java:51)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor$ActionRunner.execute(PageFlowRequestProcessor.java:2042)
 at org.apache.beehive.netui.pageflow.interceptor.action.internal.ActionInterceptors[snip](ActionInterceptors.java:57)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor.processActionPerform(PageFlowRequestProcessor.java:2114)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor.processInternal(PageFlowRequestProcessor.java:554)
 at org.apache.beehive.netui.pageflow.PageFlowRequestProcessor.process(PageFlowRequestProcessor.java:851)
 at org.apache.beehive.netui.pageflow.PageFlowActionServlet.process(PageFlowActionServlet.java:157)
 at org.apache.beehive.netui.pageflow.PageFlowUtils.strutsLookup(PageFlowUtils.java:1169)
 at org.apache.beehive.netui.pageflow.PageFlowUtils.strutsLookup(PageFlowUtils.java:1200)
 at com.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.executeAction(ScopedContentCommonSupport.java:688)
 at com.bea.netuix.servlets.controls.content.NetuiContent.preRender(NetuiContent.java:288)
 at com.bea.netuix.nf.ControlLifecycle$6.visit(ControlLifecycle.java:428)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:708)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.ControlTreeWalker.walkRecursivePreRender(ControlTreeWalker.java:717)
 at com.bea.netuix.nf.Lifecycle.run(Lifecycle.java:140)
 at com.bea.netuix.servlets.manager.PortalServlet.service(PortalServlet.java:780)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:857)
 at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
 at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
 at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
 at master.com.qwest.filters.PrimaryServletFilter.doFilter(PrimaryServletFilter.java:150)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
 at master.com.qwest.filters.log.TeaLeafServletFilter.doFilter(TeaLeafServletFilter.java:79)
 at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
 at com.bea.p13n.servlets.PortalServletFilter.doFilter(PortalServletFilter.java:252)
 at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3229)
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
 ... 4 more

We have noted the error and will be working on the issue.

I’m sure it’s going to be fun to get my half-created account fixed. Joy.

I especially like the built-in warning to their obviously awesome developers: “Please check tag attributes and closing tags. Be careful of reserved words.”

Posted to geek by mdb at 8:54 am | Comments (0)       

September 5, 2009

Shaun of the Dead

OMGROTFL. This is hands down the funniest zombie movie I’ve ever seen and ranks among the funnier films I’ve seen full stop. I consider the fact that I managed to go so long without seeing it a blemish on the otherwise good reputation of my friends.

Posted to films by mdb at 5:05 pm | Comments (0)       

September 4, 2009

Ponyo

Miyazaki is pretty hit or miss these days. Ponyo’s not a total miss as it’s chock full of bizarre imagery and general weirdness, but it’s nothing like his earlier masterpieces which shine on so many levels. Still, I suppose I’m glad he didn’t retire four movies ago, like he was threatening.

Posted to films by mdb at 7:16 pm | Comments (0)       

MDB

Bits
Ludography
Reviewlets
Camera Wrestling
Archives:

samskivert.com ©2001 - 2009 Michael Bayne <mdb@samskivert.com>