I wrote an efficient object library that looks after it's own persistence to a relational database. It means the application has objects to work with, not SQL. This is good when we have to scale up the database: we teach the objects how to scalably access the database and the application gets the benefits for free. Mind you, the objects aren't very complicated, almost always representing a single row in the database. And the object hierarchy is flat.
There are wrinkles, of course. The SQL gets simplified and generated. Complex JOINs are pushed out of the application - not that that's a bad thing; it's too easy for application programmers to create complex JOINs that take too long to run.
Wade.