3 poin oleh GN⁺ 2023-08-14 | 1 komentar | Bagikan ke WhatsApp
  • 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 berbasis lark
  • 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 fcntl untuk 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

 
GN⁺ 2023-08-14
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

    • Jadi sepertinya ada komunitas database relasional Java murni. Seperti Hypersonic, H2, Derby; kalau tidak perlu skala setingkat mesin besar, database jadi mudah didistribusikan dan digunakan, dan jika perlu juga mudah disematkan di memori
    • Sangat setuju. Dalam hal itu, seri ugit yang membuat Git dari nol dengan Python benar-benar bagus: https://www.leshenko.net/p/ugit/
    • Saya kurang yakin. Python juga sama buruknya dengan C/C++, dengan kekurangan bahwa saat belajar cara membuat database, banyak bagian menarik yang seharusnya dicoba sulit disentuh dengan Python
      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
    • Karya yang keren. Saya juga merasakan hal serupa, dan Python memungkinkan saya berfokus pada konsep tingkat tinggi. Namun sesekali ada momen ketika saya berharap mengerjakannya dengan tipe statis dan bahasa terkompilasi
  • 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?

    • Sedikit keluar topik, tetapi apakah ada materi, presentasi, atau tulisan blog bagus yang membahas cara menulis benchmark yang berguna?
    • Mengimplementasikan sesuatu seperti TPC-C di learndb dan melihat hasilnya sepertinya juga bisa jadi latihan yang menarik
  • 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...

    • Saya sangat merekomendasikan Lark untuk proyek Python. Mudah digunakan
      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
    • DSL di dalam string, apakah itu benar-benar pendekatan yang baik? Saya tidak ingat pernah memakai atau membutuhkan ini di Python, tetapi rasanya mungkin ada cara yang lebih baik
      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
    • Saya tidak bermaksud terdengar kasar, dan saya mengakui bahwa pekerjaan ini bagus serta merupakan cara untuk mempelajari hal baru. Namun jika pembuatan parser bukan tujuan akhir, melainkan sarana untuk menjalankan AST di database, saya penasaran apa yang dipelajari dari bagian parser saja
      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

    • Memang begitu. Implementasi B-tree adalah motivasi awal saya memulai proyek ini. Terutama detail yang berkaitan dengan rebalancing dan splitting node
      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

    • Untuk jaminan ACID, tidak ada konsep mengelompokkan beberapa pernyataan secara atomik, yaitu transaksi
      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