intertwingly

It’s just data

Ascetic Database Architectures


Anant Jhingran: new architectures are successful when they attack a different problem.  Providing an equivalent bit replacement (arguably at a lower cost, as Mike would say) is hardly the dominating argument that would cause people to switch.  Quite simply, as my colleague Curt Cotner points out, database engine technology is a drop in the bucket in terms of the investment it takes to be a full player in database these days. You need APIs/drivers for all the application environments (JDBC,ODBC, OLE, ADO, .NET, Ruby, PHP, Perl, etc.).  You need integration with the application servers (J2EE, persistence layers, XA protocols).  You need system integration (workload management, etc.).  You need tooling to save people cost on the admin side.  And the list goes on.  Ultimately, these AD/Admin issues consume 70% of the IT budget...

Counter example.  I’ve been playing with CouchDB.  That code is definitely pre-alpha at this point, but this post is not about the code itself, but about the interface it provides.

I was testing it by loading some pre-existing data from my weblog, and being pre-alpha software it died when it encountered some Unicode data that wasn’t expressible as iso-8859-1 expressed in JSON \Uxxxx format.  Before I leave the wrong impression, CouchDB is based on ICU and is fully Unicode enabled, but as you know all it takes is just one bug to cause a problem, and on this particular day the pre-alpha had a bug, and I hit it.  That bug was promptly fixed, but the interesting part of the story is my test case:

require 'net/http'
require 'json'

# "can't" using http://www.fileformat.info/info/unicode/char/2019/index.htm
cant = {:data=>[?c, ?a, ?n, 0x2019, ?t].pack("U*")}
puts cant.to_json
         
http = Net::HTTP.new("localhost",8888)
puts http.put('/foo/',nil)
puts http.put('/foo/0', cant.to_json)
begin        
  puts http.get('/foo/0')
ensure 
  puts http.delete('/foo') 
end

What does this sample do?  it creates a database.  It puts one object into the database.  It attempts to retrieve it back out.  Whether that retrieval succeeds or fails, it proceeds to delete the database.

What API’s/drivers to I need to integrate it with Ruby? 
HTTP and JSON.
What API’s/drivers would I need to integrate it with Java? 
HTTP and JSON.
What API’s/drivers would I need to integrate it with AJAX? 
HTTP and JSON.
What API’s/drivers would I need to integrate it with...
oh, you get my point.

Do HTTP and JSON work with existing J2EE servers?  You betcha.

What tooling to I need?  Um, a browser, perhaps?

So Anant, while I agree with Curt and yourself that adding and evangelizing a new API is generally harder than the implementation itself; the solution may very well be one that doesn’t do that.