3 puan yazan GN⁺ 2023-08-14 | 1 yorum | WhatsApp'ta paylaş
  • 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 by destekleyen learndb-sql ile lark tabanlı ö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 fcntl kullanı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

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

    • Bu yüzden saf Java ilişkisel veritabanı topluluğu var gibi. Hypersonic, H2, Derby gibi; büyük makine ölçeğine ihtiyaç yoksa veritabanını dağıtmak ve kullanmak kolay, gerekirse belleğe gömmek de kolay
    • Tamamen katılıyorum. Bu açıdan Git’i Python ile sıfırdan yapan ugit serisi gerçekten çok iyiydi: https://www.leshenko.net/p/ugit/
    • Emin değilim. Python da C/C++ kadar sorunlu; veritabanı yapmayı öğrenmek için kurcalanması gereken ilginç kısımların çoğuna Python ile dokunmanın zor olması gibi bir dezavantajı var
      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
    • Güzel iş. Ben de benzer hissettim; Python sayesinde üst düzey kavramlara odaklanabildim. Yine de arada sırada bunu statik tipli ve derlenen bir dille yapmış olmayı dilediğim anlar oldu
  • Ç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?

    • Konudan biraz sapacak ama, faydalı benchmark yazma konusunda iyi kaynaklar, sunumlar ya da blog yazıları biliyor musunuz?
    • learndb’de TPC-C gibi bir şeyi uygulayıp ne olacağını görmek de eğlenceli bir alıştırma olabilir
  • 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...

    • Python projeleri için Lark’ı kesinlikle öneririm. Kullanımı kolay
      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
    • String içinde DSL mi, bu gerçekten iyi bir yöntem mi? Python’da bunu kullandığım ya da buna ihtiyaç duyduğum bir durum aklıma gelmiyor; daha iyi bir yol mümkün olamaz mı diye düşünüyorum
      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
    • Kaba görünmek istemem; bu çalışmanın harika olduğunu ve yeni şeyler öğrenmenin bir yolu olduğunu da kabul ediyorum. Ama parser üretmek nihai hedef değil de AST’yi veritabanında çalıştırmak için bir araçsa, yalnızca parser kısmından ne öğrenileceğini merak ediyorum
      Ü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

    • Kesinlikle öyleydi. B-ağacı uygulaması bu projeye başlamamın ilk motivasyonuydu. Özellikle düğümlerin yeniden dengelenmesi ve bölünmesiyle ilgili ayrıntılar önemliydi
      Ü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ş

    • ACID garantileri konusunda, birden fazla ifadeyi atomik olarak gruplama kavramı, yani transaction, yok
      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