Show HN: LearnDB - saf Python ile sıfırdan uygulanmış bir RDBMS (SQLite klonu)
(github.com/spandanb)- LearnDB, veritabanı iç yapısını daha derinlemesine anlamak için sıfırdan uygulanmış bir ilişkisel veritabanı yönetim sistemi (RDBMS) ve SQLite klonudur
- Saf Python ile yazılmıştır; derleme aşaması yoktur, varsayılan olarak sıfır yapılandırma sunar ve yapılandırmanın ezilmesine izin veren bir yapıya sahiptir
select,from,where,group by,having,limit,order bydestekleyen learndb-sql ilelarktabanlı özel bir lexer ve parser sunar- SQL ifadelerini alıp veritabanındaki tabloları ve verileri işleyen bir motor ile disk tabanlı btree yedek veri yapısından oluşur
- Kullanım şekli olarak REPL, Python modülü import etme ve komut dosyalarını motora aktarma yöntemlerini destekler
- Kod tabanı kurcalamaya uygundur, ancak gerçek bir depolama çözümü olarak kullanılmaması gereken temel sınırlamalara sahiptir
- Kayan nokta aritmetiği, IEEE754 ile karşılaştırıldığında oldukça basitleştirilmiş şekilde uygulanmıştır
select * ...gibi joker karakterli sütun genişletme dahil, genel yardımcı özellikler desteklenmez
- Geliştirme ve çalıştırma gereksinimleri Linux/macOS sistemleri ile Python 3.9+ olup, veritabanı dosyasına münhasır okuma erişimi için
fcntlkullanılır - Başvuru kaynakları olarak cstack'in veritabanı öğreticisi, SQLite Database System: Design and Implementation, SQLite dosya biçimi belgeleri ve PostgreSQL belgeleri kullanılmıştır
1 yorum
Hacker News yorumları
Böyle bir sistemi Python gibi bir dille yazmanın aslında harika bir tercih olduğunu düşünüyorum. Veritabanları genellikle C++ ya da C ile yazılır, ama bana göre Python çok daha okunabilir ve erişilebilir
Ciddi anlamda performans hedefleniyorsa daha sonra düşük seviyeli bir dile port edilebilir; mevcut hâliyle ise öğrenme amaçlı faydalı
Ben de veritabanı motorlarının dağıtık ortamlarda nasıl çalışabileceğini öğrenmek için Python ile SQL/graf Cypher/belge/DynamoDB tarzını harmanlayan, dağıtık, çoklu modele benzeyen bir veritabanı yapmıştım: https://GitHub.com/samsquire/hash-db
Hem C hem Python; kötü dil tasarımını, tutarsızlıkları ve çeşitli tuzakları görmezden gelip yalnızca kolay kısımlara bakınca erişilebilir görünüyor. Ama C ile en azından bunu doğru yapmayı öğrenme ihtimali var; Python ile gerçek dünyanın nasıl olduğunu bile bilemeyebilirsiniz
Çok uzun zaman önce biri SQLite’ı C’den C# ile yeniden yazmış/port etmişti: https://code.google.com/archive/p/csharp-sqlite/wikis/Letter...
Dr. Richard Hipp’in bu çalışmayı ne kadar olumlu karşıladığını görmek de ilginç
Muhtemelen GitHub’daki hâli burada: https://github.com/CsharpDatabase/CsharpSQLite ve sonrasında başka klonları da olabilir
Harika. Kesinlikle eğlenceli ve tatmin edici bir deneyim olmuştur
Hızlı yapmak gibi bir niyet olmadığını biliyorum, ama sırf eğlence olsun diye birkaç benchmark da hazırlayabilir misiniz?
Bu yazı sayesinde Python için oldukça iyi görünen Lark adlı parser kütüphanesini öğrendim
Sitedeki JSON öğreticisi harika. JSON için temel bir parser oluşturmayı gösterdikten sonra performansı nasıl iyileştireceğini epey ayrıntılı ele alıyor: https://lark-parser.readthedocs.io/en/latest/json_tutorial.h...
RDBMS projesinde kullanılan dilbilgisi burada: https://github.com/spandanb/learndb-py/blob/master/learndb/l...
Dilbilgisini debug ederken IDE çok işe yaradı: https://www.lark-parser.org/ide/
EvaDB’de, yapay zeka modellerinin kullanımına uyarlanmış SQL benzeri dil için Lark kullanıyoruz: https://github.com/georgia-tech-db/evadb/blob/master/evadb/p... https://github.com/georgia-tech-db/evadb/
Lark hoşunuza gittiyse sponsor olmayı da düşünebilirsiniz: https://github.com/sponsors/lark-parser
Beklenen anahtarlara sahip dict’ler ve bit OR operatörüyle kurulum kullanmak bile, birçok dilbilgisi biçimiyle kabaca örtüştüğü için daha iyi olmaz mı? import olduğu gibi kalır, bir şekilde karıştırılabilir gibi geliyor
İlk bakışta aklıma gelen düşünce bu; bir şeyi kaçırıyor olabilirim
Üretilen parser’ı daha verimli hâle getirmek için sürekli optimize edilmesi gereken kısımlar mı var?
Mantıklı bir sonraki adım, AST’den en iyi sorgu planını üretmek mi olur?
Çok iyi
SQLite’ı okumak oldukça zor, ama bu uygulama epey anlaşılır. Özellikle sanal makine kısmı öyle: https://github.com/spandanb/learndb-py/blob/master/learndb/v...
Şu dosyayla karşılaştırılabilir: https://github.com/sqlite/sqlite/blob/master/src/vdbe.c
Yine de bu LearnDB’nin ne kadar eksiksiz olduğunu merak ediyorum. SQLite’ın okunmasının zor olmasının nedeni yalnızca eski olması değil; SQL’in çok büyük bir kısmını ele alması ve SQL spesifikasyonunu izledikçe karmaşıklaşması da bir etken
SQLite’ın harika bir test paketi var; bu uygulama üzerinde o testleri çalıştırmak iyi olabilir
Gerçekten iyi ve benim gibi birinin veri yapıları ve algoritmaları daha iyi öğrenmesi için iyi bir yol gibi görünüyor. B+ ağacının nasıl çalıştığını açıklayabilirim ama benden doğrudan kodlamam istense sanırım duraksarım
Veritabanlarını ve Python’ı sevdiğim için göz atma süreci gerçekten ilginçti
Üstelik diskte saklanan bir yapı olması, uygulamayı düşünürken bir başka karmaşıklık unsuru daha ekledi
SQLite test paketinin ne kadarını geçebilir acaba?
ACID garantileri ya da sorgu planlama/optimizasyon destekliyor mu?
Desteklemesi gerektiğini ima ederek sormuyorum; B-ağaçları ve SQL dışında ne kadarını denediğini bilmek istiyorum
Ben de bir gün böyle bir şey denemek isterim. Harika iş
Ama bunun dışında tek dosyalı bir veritabanı ve veritabanı dosyasını işleyen süreç de yalnızca tek bir learndb örneği olabiliyor. Bu yüzden tek bağlantılı bir veritabanı olması nedeniyle tutarlılık ve izolasyon elde ediliyor
Kalıcılık ise dosya sistemi ne kadar kalıcılık sağlıyorsa o kadar var. Yani ACID özelliklerinin bir noktasında duruyor
Sorgu planlama/optimizasyon henüz uygulanmadı, ama optimizasyon modülünün nereye yerleşebileceğini düşündüm. Parser bir AST üretiyor; bu AST ya da ondan türetilmiş bir ara temsil optimize edilebilir
Yani VM, AST’yi çalıştırmadan önce AST yeniden yazılabilir veya düğümler silinebilir
Biraz farklı bir konu ama Python’da mapDB gibi bir şey var mı?
https://mapdb.org
Harika bir proje. Kod da çok okunabilir, yorumlar da harika