Show HN: LearnDB - 純粋なPythonでゼロから実装したRDBMS(SQLiteクローン)
(github.com/spandanb)- LearnDBは、データベース内部構造をより深く理解するためにゼロから実装した**リレーショナルデータベース管理システム(RDBMS)**およびSQLiteクローン
- 純粋なPythonで書かれており、ビルド手順がなく、基本的にゼロ設定で、設定をオーバーライドできる構造
select、from、where、group by、having、limit、order byをサポートするlearndb-sqlと、larkベースのカスタムレキサー・パーサーを提供- SQL文を受け取り、データベースのテーブルとデータを操作するエンジン、ディスクベースのbtreeバックアップデータ構造で構成
- 利用方法はREPL、Pythonモジュールとしてのimport、コマンドファイルをエンジンに渡す方式をサポート
- コードベースはtinkeringに適しているが、実際のストレージソリューションとして使ってはいけない重要な制限がある
- 浮動小数点演算はIEEE754と比べて非常に単純化された実装
select * ...のようなワイルドカードカラム展開など、一般的なユーティリティ機能は未サポート
- 開発時の実行要件はLinux/macOSシステムとPython 3.9以上で、データベースファイルへの排他的な読み取りアクセスのために
fcntlを使用 - 参考資料として、cstackのデータベースチュートリアル、SQLite Database System: Design and Implementation、SQLiteファイルフォーマット文書、PostgreSQL文書を使用
1件のコメント
Hacker News の意見
Python のような言語でこうしたシステムを書くのは、むしろ素晴らしい選択だと思う。データベースはたいてい C++ や C で書かれるが、自分にとっては Python のほうがずっと読みやすく、取り組みやすい
本気で性能を狙うなら後で低レベル言語に移植すればいいし、今の形では学習用として有用
自分もデータベースエンジンが分散環境でどう動作し得るのかを学ぶために、Python で SQL/グラフ Cypher/ドキュメント/DynamoDB スタイルを混ぜた分散型の擬似マルチモデルデータベースを作った: https://GitHub.com/samsquire/hash-db
C も Python も、悪い言語設計や不整合、数々の落とし穴を無視して簡単な部分だけ見れば取り組みやすく見える。しかし C なら少なくとも正しくやる方法を学べる可能性はあるが、Python では現実世界がどうなっているのかすら分からないかもしれない
かなり昔、誰かが SQLite を C から C# に書き直し/移植したことがある: https://code.google.com/archive/p/csharp-sqlite/wikis/Letter...
Dr. Richard Hipp がその作業をどれほど歓迎していたかも見る価値がある
GitHub ではおそらくここにあるようだ: https://github.com/CsharpDatabase/CsharpSQLite その後のクローンもさらにあるかもしれない
素晴らしい。きっと楽しく、やりがいのある経験だったはず
高速に作る意図ではなかったのは分かるが、面白半分にベンチマークもいくつか作ってみられないだろうか?
この記事のおかげで、Python 向けの Lark というかなり良さそうなパーサーライブラリを知った
サイトの JSON チュートリアルが素晴らしい。JSON 用の基本パーサーの作り方を示したうえで、性能を改善する方法をかなり詳しく扱っている: https://lark-parser.readthedocs.io/en/latest/json_tutorial.h...
RDBMS プロジェクトで使われた文法はここにある: https://github.com/spandanb/learndb-py/blob/master/learndb/l...
文法をデバッグするときに IDE が非常に便利だった: https://www.lark-parser.org/ide/
EvaDB では、AI モデル利用に合わせた SQL 風言語に Lark を使っている: https://github.com/georgia-tech-db/evadb/blob/master/evadb/p... https://github.com/georgia-tech-db/evadb/
Lark が気に入ったなら、スポンサーになることも検討してよい: https://github.com/sponsors/lark-parser
期待するキーを持つ dict と、ビット OR 演算子による構成だけでも、多くの文法形式とおおよそ対応していて、より良いのでは? import は import のままにして、何らかの形で混ぜられそう
ざっと見て最初に思ったことなので、何か見落としているかもしれない
生成されたパーサーをより効率的にするために、継続的に最適化しなければならない部分があるのだろうか?
論理的な次の段階は、AST から最適なクエリプランを生成することなのだろうか?
とても良い
SQLite は読むのが非常に難しいが、この実装はかなり理解しやすい。特に仮想マシンの部分がそうだ: https://github.com/spandanb/learndb-py/blob/master/learndb/v...
このファイルと比較できる: https://github.com/sqlite/sqlite/blob/master/src/vdbe.c
ただ、この LearnDB がどれほど完全なのかは気になる。SQLite が読みにくいのは古いからだけではなく、SQL の多くの部分を扱い、SQL 仕様に従ううちに複雑になるからでもある
SQLite には優れたテストスイートがあるので、この実装にそのテストを走らせてみるとよさそう
本当に良くて、私のような人がデータ構造とアルゴリズムをよりよく学ぶのに良い方法に見える。B+木がどう動作するかは説明できるが、自分でコーディングしろと言われると戸惑いそう
データベースと Python が好きなので、ざっと見ていく過程が本当に興味深かった
さらにディスクに保存される構造である点が、実装を考えるうえでもう一つの複雑な要素を加えていた
SQLite テストスイートのうち、どれくらい通せるのだろう?
ACID 保証やクエリプランニング/最適化はサポートしている?
できるべきだという意味で聞いているのではなく、B木と SQL 以外にどこまで試したのか知りたい
自分もいつかこういうものをやってみたい。素晴らしい仕事だ
しかしそれ以外では単一ファイルのデータベースであり、データベースファイルを操作するプロセスも 1 つの learndb インスタンスだけが可能だ。なので単一接続データベースという点で一貫性と分離性が得られる
永続性はファイルシステムが永続性を提供する分だけ得られる。だから ACID 特性のどこかには位置している
クエリプランニング/最適化はまだ実装していないが、最適化モジュールをどこに入れられるかは考えてみた。パーサーが AST を出力し、この AST やそこから派生した中間表現を最適化できる
つまり VM が AST を実行する前に、AST を書き換えたりノードを削除したりできる
少し話はそれるが、Python にも mapDB のようなものはある?
https://mapdb.org
素晴らしいプロジェクトだ。コードも非常に読みやすく、コメントも素晴らしい