(Note however, that since then, John and Duncan Temple Lang generalized the data management in S4 a lot, including Duncan's implementation in his RObject Tables package where he considered a lot of synchronization/caching issues relevant to DBI and, more generally, to most external interfaces).
Back then we were working very closely with Lucent's microelectronics manufacturing --- our colleagues there had huge Oracle (mostly) databases that we needed to constantly query via SQL*Plus.
(Tim Keitt was most active with the dbi/Postgre SQL packages --- he also was considering what he called "proxy" objects, which was reminiscent of what Duncan had been doing). The interface defines a small set of classes and methods similar in spirit to Perl's DBI, Java's JDBC, Python's DB-API, and Microsoft's ODBC.It defines a set of classes and methods defines what operations are possible and how they are performed: DBI separates the connectivity to the DBMS into a "front-end" and a "back-end". The facilities that communicate with specific DBMSs (SQLite, My SQL, Postgre SQL, Monet DB, etc.) are provided by "drivers" (other packages) that get invoked automatically through S4 methods.My colleague Jake Luciani was developing advanced applications in C and SQL, and the two of us came up with the first implementation of S3 directly connecting with Oracle.What I remember is that the Linux PRO*C pre-compiler (that embedded SQL in C code) was very buggy --- we spent a lot of time looking for workarounds and tricks until we got the C interface running.