My latest project is called NNDB.
I’ve worked with databases for quite a long time now, and for a while I’ve been thinking about how they work under the hood. I know very little about it, but I thought I could learn a bit by trying to implement something similar myself.
I’m interested in how queries work against joined tables, how to implement indices and so on.
I’ve also been feeling that I want to do some C++ as an open source project. I do it all day at work, and for some problems it feels like the right tool for the job.
NNDB is sort-of like an in-memory database, but it works with C++ types for its columns, instead of a fixed set like varchar, int etc. You can put your own value-typed classes in the columns, and all values are type-checked at compile time.
It’s always struck me as strange that with a traditional code+SQL setup you have to keep your SQL in sync with your code manually. Of course, there are lots of trendy Object-Relational-Mapping thingies that solve that problem, but I felt it could be approached from another direction: instead of generating code to match your data, or generating SQL to match your code, why not specify your data structure in code?
In NNDB you define a table something like this:
typedef nndb::Values< unsigned long, std::string, std::string, MyDate >
PersonValues;
class PersonTable : public nndb::Table
{
public:
enum Columns
{
id,
first_name,
last_name,
date_of_birth
};
};
Actually, defining your own class is unnecessary, but it’s nice to have an enum to name your columns, and making a class gives you a nice place to put it.
To insert a row you do something like this:
PersonTable person_table;
person_table.Insert( PersonValues( 0,
"Andy", "Balaam", MyDate( 12000000 ) ) );
You can do simple queries with WHERE and ORDER BY clauses, and I’m working on indexes.
After that will come JOINs, and anything else that takes my fancy.
I don’t anticipate NNDB being useful to anyone – it’s really for me to understand why things are as they are in the world of databases. However, you never know – it may turn out to be a fast and convenient way to store data in the C++ world. I think some of the applications that use databases don’t really need the kind of concurrent multi-user network-accessible features they have, but really just want to search, join and store reliably, and NNDB might one day grow into something that can find a niche.
To explore more, check out the complete example.