Recently created a minimal persistent relational database in Go. Main focus was on implementing & understanding working the of database, storage management & transaction handling. Use of B+ Tree for storage engine(support for indexing), managing a Free List (for reusing nodes), Support for transactions, Concurrent Reads.
Still have many things to add & fix like query processing being one of the main & fixing some bugs
Repo link - https://github.com/Sahilb315/AtomixDB
Would love to hear your thoughts
You watched CMU's intro to Database sytems, right? It's really good and thorough. It will save you of some common pitfalls and can help you navigate the trade-offs.
https://www.youtube.com/watch?v=otE2WvX3XdQ&list=PLSE8ODhjZX...
I hope some company that heavily relies on Postgres sponsors a project to replace the optimizer with a more modern implementation. I feel like for any large applications with olap style queries (even if on the OLTP database) will benefit incredibly from that work. SQL Servers optimizer was light-years ahead of Postgres when I worked with it last over a decade ago.
Dead Comment
- TiDB by PingCAP
- Vitess by PlanetScale
Both are basically only the SQL part as TiDB uses TiKV (written in Rust) and Vitess uses MySQL.
For those who want to implement a database in Go but without having to implement a network protocol there is go-mysql, which allows you to do this: https://github.com/go-mysql-org/go-mysql/blob/master/cmd/go-... As demonstration I created a networked SQLite: https://github.com/dveeden/go-mysql-examples/blob/main/go-my...
Both TiDB and Vitess have parsers that can be used outside standalone. So if you only want to implement your own on disk format, this can help.
Note that I'm working for PingCAP on TiDB and I'm also a co-maintainer for go-mysql.
https://github.com/thomasjungblut/go-sstables
https://github.com/MIT-DB-Class/go-db-2024https://dsg.csail.mit.edu/6.5830/
One thing I’d add to the readme is an example of how you’d use the database in an example application. From the docs, it’s clear that this isn’t a sql database (yet?), so it would be good to have an example to see how to use the database.
It might also be nice to have a description of what happens when you insert or get a record, so others can learn from the code too. Or can you comment here about what your favorite part of the code is? What did you figure out that you didn’t know before? If you’re using the project to learn about databases, what have you learned so far?
Learnt about B+ Trees, transactions, managing concurrent reads & data presistence
congratz !
At this point i think its important to mention that its nativly an in-memory graph database/storage.
At some point (4-5 years ago) i decided to change the way i handle it. Since im using the storage in many private projects, and there was no real traction (while also maintaining a database is quite some work) i decided i gonne change the way i handle it away from a standalone database to a library that works as an in-memory graph storage.
Also i added a custom query language including builder (the queries are 100% json compatible so you can in theory build queries from whatever language and transmit it via json.
The library is released under : https://github.com/voodooEntity/gits
Currently im completly reworking the query parser but since this is a privat project and im the only maintainer it may take some to to finish it. The update will takle some smaller bugs in the query parser that can occur on very complex nested queries and also will optimize query speeds. I cant provide a date when the update will occure i only can say it will (because i need it myself).
Finally said: The strength of gits is to be very fast (hence in memory handling) and easy to use from golang. Its threadsafe by default.
https://www.sqlite.org/lemon.html
You could probably use something like participle, but you'd have to translate the grammar.
https://github.com/alecthomas/participle
I share the same goal and am working through the material after working through Codecrafters' "Build your own SQLite" [1]. Good luck!
I apologize in advance for mistakes (formatting, et cetera). I just registered this account to point you toward resources I found helpful.
[0] https://build-your-own.org/database/
[1] https://app.codecrafters.io/courses/sqlite/overview