- LearnDB adalah sistem manajemen basis data relasional (RDBMS) dan klon SQLite yang diimplementasikan dari nol untuk memahami struktur internal basis data lebih mendalam
- Ditulis dengan Python murni sehingga tidak ada tahap build, pada dasarnya tanpa konfigurasi, dengan struktur yang memungkinkan override konfigurasi
- Menyediakan learndb-sql yang mendukung
select,from,where,group by,having,limit,order by, serta lexer·parser kustom berbasislark - Terdiri dari engine yang menerima pernyataan SQL untuk memanipulasi tabel dan data basis data, serta struktur data cadangan btree berbasis disk
- Mendukung penggunaan melalui REPL, import modul Python, dan cara meneruskan file perintah ke engine
- Codebase ini cocok untuk tinkering, tetapi memiliki keterbatasan inti sehingga tidak boleh digunakan sebagai solusi penyimpanan yang sesungguhnya
- Aritmetika floating-point diimplementasikan dengan sangat disederhanakan dibandingkan IEEE754
- Fitur utilitas umum seperti ekspansi kolom wildcard semacam
select * ...tidak didukung
- Persyaratan menjalankan pengembangan adalah sistem Linux/macOS dan Python 3.9 ke atas, serta menggunakan
fcntluntuk akses baca eksklusif pada file basis data - Referensi yang digunakan mencakup tutorial basis data dari cstack, SQLite Database System: Design and Implementation, dokumentasi format file SQLite, dan dokumentasi PostgreSQL
1 komentar
Pendapat Hacker News
Menurut saya, menulis sistem seperti ini dengan bahasa seperti Python justru merupakan pilihan yang sangat baik. Database biasanya ditulis dalam C++ atau C, tetapi bagi saya Python jauh lebih mudah dibaca dan lebih mudah didekati
Jika serius mengejar performa, nanti bisa dipindahkan ke bahasa level rendah; dalam bentuknya sekarang, ini berguna untuk pembelajaran
Saya juga pernah membuat semacam database multi-model terdistribusi dengan campuran gaya SQL/graf Cypher/dokumen/DynamoDB di Python, untuk mempelajari bagaimana engine database dapat bekerja di lingkungan terdistribusi: https://GitHub.com/samsquire/hash-db
Baik C maupun Python tampak mudah didekati jika hanya melihat bagian mudahnya dan mengabaikan desain bahasa yang buruk, inkonsistensi, serta berbagai jebakan. Namun dengan C setidaknya ada kemungkinan mempelajari cara melakukannya dengan benar, sedangkan dengan Python Anda bisa saja bahkan tidak tahu seperti apa dunia nyata
Dulu sekali, seseorang pernah menulis ulang/mem-porting SQLite dari C ke C#: https://code.google.com/archive/p/csharp-sqlite/wikis/Letter...
Menarik juga melihat betapa Dr. Richard Hipp menyambut pekerjaan itu
Mungkin yang di GitHub ada di sini: https://github.com/CsharpDatabase/CsharpSQLite dan mungkin ada lebih banyak clone setelahnya
Luar biasa. Pasti pengalaman yang menyenangkan dan memuaskan
Saya tahu niatnya bukan untuk membuatnya cepat, tetapi sekadar untuk bersenang-senang, bisakah dibuat beberapa benchmark juga?
Berkat tulisan ini saya jadi tahu library parser untuk Python bernama Lark yang tampaknya cukup bagus
Tutorial JSON di situsnya luar biasa. Ia menunjukkan cara membuat parser dasar untuk JSON, lalu membahas cukup detail cara meningkatkan performanya: https://lark-parser.readthedocs.io/en/latest/json_tutorial.h...
Grammar yang digunakan dalam proyek RDBMS ini ada di sini: https://github.com/spandanb/learndb-py/blob/master/learndb/l...
IDE-nya sangat berguna saat men-debug grammar: https://www.lark-parser.org/ide/
Di EvaDB, kami menggunakan Lark untuk bahasa mirip SQL yang disesuaikan dengan penggunaan model AI: https://github.com/georgia-tech-db/evadb/blob/master/evadb/p... https://github.com/georgia-tech-db/evadb/
Jika Anda menyukai Lark, patut juga mempertimbangkan untuk mensponsorinya: https://github.com/sponsors/lark-parser
Dengan hanya memakai dict yang punya key yang diharapkan dan komposisi lewat operator bitwise OR, bukankah itu lebih baik karena kurang lebih cocok dengan banyak bentuk grammar? import tetap dibiarkan seperti import, dan sepertinya bisa dicampur dengan cara tertentu
Ini hanya kesan pertama setelah melihat sekilas, jadi mungkin ada yang saya lewatkan
Apakah ada bagian yang perlu terus dioptimalkan agar parser yang dihasilkan menjadi lebih efisien?
Apakah langkah logis berikutnya adalah menghasilkan rencana kueri optimal dari AST?
Sangat bagus
SQLite sangat sulit dibaca, tetapi implementasi ini cukup mudah dipahami. Terutama bagian virtual machine-nya: https://github.com/spandanb/learndb-py/blob/master/learndb/v...
Bisa dibandingkan dengan berkas ini: https://github.com/sqlite/sqlite/blob/master/src/vdbe.c
Namun saya penasaran seberapa lengkap LearnDB ini. SQLite sulit dibaca bukan hanya karena sudah tua, tetapi juga karena menangani banyak bagian SQL dan menjadi kompleks karena mengikuti spesifikasi SQL
SQLite memiliki test suite yang sangat bagus, jadi sepertinya menarik jika pengujian itu dijalankan pada implementasi ini
Benar-benar bagus, dan terlihat seperti cara yang baik bagi orang seperti saya untuk mempelajari struktur data dan algoritma dengan lebih baik. Saya bisa menjelaskan cara kerja B+ tree, tetapi kalau diminta mengodekannya sendiri mungkin saya akan agak ragu
Saya suka database dan Python, jadi proses menelusurinya terasa sangat menarik
Selain itu, fakta bahwa strukturnya disimpan di disk menambahkan satu lapisan kompleksitas lagi saat memikirkan implementasinya
Kira-kira berapa banyak dari test suite SQLite yang bisa dilewati?
Apakah mendukung jaminan ACID atau perencanaan/optimisasi kueri?
Saya tidak bertanya seolah-olah itu harus bisa, hanya ingin tahu sejauh mana yang dicoba selain B-tree dan SQL
Saya juga ingin mencoba hal seperti ini suatu hari nanti. Kerja yang keren
Namun selain itu, ini adalah database satu berkas, dan hanya satu instance learndb yang bisa menjadi proses yang memanipulasi berkas database. Jadi, sebagai database dengan satu koneksi, ia mendapatkan konsistensi dan isolasi
Durabilitas didapat sejauh sistem berkas menyediakan durabilitas. Jadi posisinya ada di suatu titik dalam sifat-sifat ACID
Perencanaan/optimisasi kueri belum diimplementasikan, tetapi saya sudah memikirkan di mana modul optimisasi bisa ditempatkan. Parser mengeluarkan AST, dan AST ini atau representasi antara yang diturunkan darinya bisa dioptimalkan
Artinya, sebelum VM mengeksekusi AST, AST bisa ditulis ulang atau node-nya dihapus
Sedikit di luar topik, tetapi apakah di Python ada sesuatu seperti mapDB?
https://mapdb.org
Proyek yang luar biasa. Kodenya juga sangat mudah dibaca, dan komentar-nya juga bagus