Show HN: A Database Written in Golang

github.com

130 points by Sahil121 6 hours ago

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

alecco 2 hours ago

Cool!

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...

  • hobs 2 hours ago

    Looks fun, but the intro requirement is "Knows C++" - that's kinda a non starter right?

    • alecco an hour ago

      I'm sure that's for the homework.

twalla 4 hours ago

Someone asked about resources and I ran into this while evaluating embedded db options for a golang project - it's a collection of db components implemented in golang:

https://github.com/thomasjungblut/go-sstables

  • tjungblut 3 hours ago

    thank you for referring, feel free to ask any questions you may have

mbreese 4 hours ago

This looks like a good exploratory project!

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?

  • Sahil121 3 hours ago

    thanks man yes currently it is not a fully sql database (have to add query support) My fav part of code is the data retrieval code because had some issues there & got to know lot about it

    Learnt about B+ Trees, transactions, managing concurrent reads & data presistence

bob1029 3 hours ago

If you are wanting proper SQL command support, you could copy the SQLite parser approach. Properly parsing all valid command texts is not a problem that I would find compelling unless I was being compensated for it.

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

fipar 2 hours ago

Congratulations on a great exploratory project!

It takes me back to my school years. I never got as far as you (not by any long stretch actually), but I did enjoy creating the storage layer of a database from scratch. To actually have to deal with, instead of just think of, all the edge cases, is quite the transformative experience.

As a humble suggestion, since it seems your goal is to understand how relational databases work and not necessarily to write a new database that will compete with others, maybe don't make it an SQL one? We've got enough of those, and not enough of the others. Would be nice to have a new relational DB using Tutorial D as its language for example.

Keep hacking!

  • Sahil121 2 hours ago

    thanks for the suggestion man, will definitely think about this

voodooEntity 3 hours ago

I didnt look into it yet but i already wanted to say - cuz of curiosity i build my own graph database in golang :) and i learned alot. so i absolutly understand why you did it and what experiences you probably made on the way :D

congratz !

pighive 5 hours ago

Nice, did you follow a course or any resources to build it? Please share, I have a similar goal. Thank you.

  • rebelmackerel 3 hours ago

    I took a quick glance at the code, I believe it may build upon "Build Your Own Database From Scratch in Go" [0]. The first part of the book is available for free on the author's website, along with information on how to purchase the full book (which includes source code).

    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

eatonphil 4 hours ago
whalesalad 5 hours ago

How do you connect to it and actually use it? Does it behave like a SQL database? Row-based? Column-based? Good for analytical workloads? Document store? Redis/memcached database? What are it's strengths or weaknesses?

Cool accomplishment in and of itself but hard for anyone here to really give you any criticism or feedback without understanding where it excels and how to work with it.

  • maxmcd 4 hours ago

    It does not seem to speak SQL:

        $ git clone git@github.com:Sahilb315/AtomixDB.git
        Cloning into 'AtomixDB'...
        $ cd AtomixDB/
        $ go run .
        Welcome to AtomixDB
        Available Commands:
          CREATE       - Create a new table
          INSERT       - Add a record to a table
          DELETE       - Delete a record from a table
          GET          - Retrieve a record from a table
          UPDATE       - Update a record in a table
          BEGIN        - Begin new transaction
          COMMIT       - Commit transaction
          ABORT        - Rollback transaction
          EXIT         - Exit the program
        
        > create
        Enter table name: foo
        Enter column names (comma-separated): bar,baz
        Enter column types (comma-separated as numbers): 1,2
        Enter indexes (format: col1+col2,col3, ... or leave empty):
        Table 'foo' created successfully.
        > get
        Enter table name: foo
        
        Select query type:
        1. Index lookup (primary/secondary key)
        2. Range query
        3. Column filter
        Enter choice (1, 2 or 3):
    
    
    It looks like records are stored in rows: https://github.com/Sahilb315/AtomixDB/blob/64c95afa8e574595c...

    I do find the source to be well organized and quite readable. Especially if you runs the commands in the cli and then trace how they are each implemented.

    • Sahil121 3 hours ago

      yes man it is currently a sql db, have to work on adding query language thanks for checking it out

  • Sahil121 3 hours ago

    it is kind of a sql db but currently does not have the query lang (sql lang) & data is stored in tables similar to other relational DBs. Still have a lot of stuff to add & fix Will add more detail to it

  • zsoltkacsandi 4 hours ago

    > Main focus was on implementing & understanding working the of database

    I think this clearly describes what was the goal.

    • whalesalad 4 hours ago

      Yep... but there are dozens of different types of databases out there. There is no way to look at this codebase and give any kind of feedback one way or the other without that understanding, particularly with zero usage examples. Which is what the OP is asking about.

      • jasonlotito 4 hours ago

        > There is no way to look at this codebase and give any kind of feedback

        Less than a minute and I know how to use it. It's not complicated. The source code is available and fairly easy. If you can't figure out how to use it in a trivial amount of time, you aren't going to be able to offer anything of value. When did HN go from being about interesting stuff to making bold, ignorant statements like "There is no way to look at this codebase and give any kind of feedback one way or the other without that understanding."

        You should know better.

        • whalesalad 4 hours ago

          [flagged]

          • ge96 4 hours ago

            yeah as a dev/non-go person don't know how it works either. I assume main.go is where it starts but then what... I see a commands maybe it works by CLI? idk either

            • Xarodon 4 hours ago

              Yes it's a CLI REPL, you build and run the binary using the instructions in the README and then create/insert/select from it by typing those commands into the CLI.

              Currently there's no way to connect to it like you would a normal SQL db, but you could embed it like you would sqlite.

              • ge96 4 hours ago

                Hopefully there is a help/man

            • arp242 2 hours ago

              If you're not a developer then you're not the target audience for this.

            • otteromkram 4 hours ago

              You're a "dev," but don't seek out test folders/files for use case examples?

              Don't let your employer know...

              • lelandbatey 3 hours ago

                They can be a dev and not want to have to clone and explore the code. There's tons of little bits of friction that're not addressed by the "face" of the repo. E.g. The readme doesn't seem to imply how to connect to this database (the answer is you write to its stdin, it's not socket based).

                We're not at work here. Low effort posts are allowed though not encouraged. Implying that making a low effort post somehow makes you not a developer ("you're a 'dev' but don't seem out tests?") is it's own low effort post, while also being hurtful.

                Please, let's keep things kind, focused, and clear.

              • ge96 3 hours ago

                [flagged]

esafak 5 hours ago

[flagged]

  • anonzzzies 5 hours ago

    "Main focus was on implementing & understanding working the of database, storage management & transaction handling."

    Obviously OP wrote it to understand database theory & implementation.

  • pjmlp 4 hours ago

    That a database written in an AOT compiled managed language is possible, for example.

    Specially relevant, because it used to be that writing database engines used to be considered systems programming, and we all know managed languages cannot be possible used for such tasks. /s

  • ajsnigrutin 4 hours ago

    It's hackernews, basically every old thing has to be reinvented in the "language of the week", be it go, rust, ruby, or whatever was before that.

    From a learning perspective, nice project for OP, for 'advertising' it, i'd prefer the "what's better than the alternatives" instead of focusing on the language.