-- Leo's gemini proxy

-- Connecting to republic.circumlunar.space:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

NNDB's Not a Database


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.


NNDB


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.


Originally posted at 2009-10-10 07:22:04+00:00. Automatically generated from the original post : apologies for the errors introduced.


complete example

original post

-- Response ended

-- Page fetched on Sun May 19 07:00:01 2024