Basit bir veritabanı motoru nasıl yazılır [kapalı]


143

Bir veritabanı motorunun nasıl çalıştığını öğrenmekle ilgileniyorum. CS'de öğretilen temel veri yapılarının çoğunu (ağaçlar, hash tabloları, listeler, vb.) Ve derleyici teorisini oldukça iyi anlıyorum (ve çok basit bir tercüman uyguladım) biliyorum ama nasıl gideceğimi anlamıyorum bir veritabanı motoru yazma hakkında. Konuyla ilgili dersleri aradım ve bulamadım, bu yüzden başka birinin beni doğru yönde gösterebileceğini umuyorum. Temel olarak, aşağıdakiler hakkında bilgi istiyorum:

  • Verilerin dahili olarak nasıl saklandığı (yani tabloların nasıl temsil edildiği vb.)
  • Motor ihtiyaç duyduğu verileri nasıl bulur (örneğin bir SELECT sorgusu çalıştırın)
  • Veriler hızlı ve verimli bir şekilde nasıl eklenir?

Ve bununla ilgili olabilecek diğer konular. Disk üzerinde bir veritabanı olması gerekmez - hatta bir bellek içi veritabanı bile iyidir (eğer daha kolaysa) çünkü sadece arkasındaki prensipleri öğrenmek istiyorum.

Yardımın için çok teşekkürler.

Yanıtlar:


55

Kod okuma konusunda iyiyseniz, SQLite okumak veritabanı tasarımı hakkında size tüm tekne yükünü öğretecektir. Küçük, bu yüzden başınızı etrafa sarmak daha kolay. Ama aynı zamanda profesyonelce yazılmış.

http://sqlite.org/


2
Sqlite LOC indir shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, toplam => 147011
Khaja Minhajuddin

1
Muhtemelen kıvırcık bir ayraç dili kullanarak tamamen işlevsel bir veritabanı motoru yapabileceğiniz kadar küçüktür. SQLite ayrıca C # 'da mevcuttur.
Robert Harvey


4
SQLite 2.5.0 kodunu okumanızı tavsiye ederim: github.com/davideuler/SQLite-2.5.0-for-code-reading , SQLite'ın modern GCC'de derlenip çalıştırılabilen erken bir sürümüdür (test ettim MacOS 10.13 ve Debian 8'de)
David Euler

1
cstack.github.io/db_tutorial iyi bir başlangıç ​​noktasıdır.
Ashish Negi

25

Bu sorunun cevabı çok büyük. bir doktora tezinin% 100 cevap vermesini beklemek;) ancak sorunları tek tek düşünebiliriz:

  • Veriler dahili olarak nasıl saklanır: veritabanı nesnelerinizi içeren bir veri dosyanız ve odaktaki verileri yüklemek için bir önbellek mekanizmanız olmalı ve etrafındaki bazı veriler RAM'e bir tablonuz olduğunu varsayar, bazı verilerle bir veri biçimi oluştururuz bir sütun ayırıcı ve bir satır sınırlayıcı tanımını kabul ederek bu tabloyu ikili bir dosyaya dönüştürmek ve bu sınırlayıcı kalıbının verilerinizde asla kullanılmadığından emin olmak için. örneğin, sütunları ayırmak için <*> seçeneğini belirlediyseniz, bu tabloya yerleştirdiğiniz verileri bu kalıbı içermeyecek şekilde doğrulamanız gerekir. ayrıca, aramanızı hızlandırmak için satır boyutunu ve bazı dahili dizinleme numarasını belirterek bir satır üstbilgisi ve bir sütun üstbilgisi ve her sütunun başlangıcında "Adam", 1, 11.1, "

  • Öğeleri hızlı bir şekilde, yukarıdaki aynı örneği alarak farklı ölçütlere göre saklanan ve önbelleğe alınan verileri işaretlemek için karma ve dizine eklemeyi kullanmayı deneyin, ilk sütunun değerini sıralayabilir ve alfabetik olarak sıralanmış öğelerin satır kimliğine işaret eden ayrı bir nesnede saklayabilirsiniz. , ve bunun gibi

  • Oracle'dan veri eklemeyi nasıl hızlandıracağım, hem RAM'de hem de diskte geçici bir yere veri ekleyip periyodik olarak temizlik yapıyorlar, veritabanı motoru yapısını her zaman optimize ediyor ama aynı zamanda yapmıyoruz böyle bir şeyin elektrik kesintisi durumunda veri kaybetmek istemektedir. bu nedenle verileri sıralama olmadan bu geçici yerde tutmaya çalışın, orijinal depolama alanınızı ekleyin ve daha sonra sistem ücretsiz olduğunda dizinlerinize yerleştirin ve bittiğinde geçici alanı temizleyin

iyi şanslar, harika bir proje.


11

SQLite daha önce bahsedilmişti, ama bir şeyler eklemek istiyorum.

Şahsen SQlite çalışarak çok şey öğrendim. İlginç olan şey, ben sadece kısa bir göz vardı rağmen kaynak koduna gitmedim. Teknik materyali okuyarak ve özellikle oluşturduğu iç komutlara bakarak çok şey öğrendim. İçinde kendi yığın tabanlı bir tercüman vardır ve sadece açıklama kullanarak dahili olarak oluşturduğu P-Kodunu okuyabilirsiniz. Böylece çeşitli yapıların düşük seviyeli motora nasıl çevrildiğini görebilirsiniz (bu şaşırtıcı derecede basittir - aynı zamanda istikrarının ve verimliliğinin sırrıdır).




8

Www.sqlite.org adresine odaklanmanızı öneririm

Son zamanlarda, küçük (kaynak kodu 1MB), açık kaynak (böylece kendiniz anlayabilirsiniz) ...

Nasıl uygulandığı hakkında kitaplar yazılmıştır:

http://www.sqlite.org/books.html

Hem masaüstü bilgisayarlar hem de cep telefonları için çeşitli işletim sistemlerinde çalışır, bu yüzden deneme yapmak kolaydır ve bunu öğrenmek şu anda ve gelecekte faydalı olacaktır.

Burada bile iyi bir topluluk var: /programming/tagged/sqlite


1
3.10 için bayt boyutu şimdi neredeyse 7.0 mb kaynak kodudur. Sadece özel bir kişi hepsini tek bir oturuşta sindirebilir. Yine de, bu da başlamak için iyi bir yerdir.
Laurie Stearn

1
Aslında. Son zamanlarda SQLite kaynak kodu içinde SQLCipher bir hata bulmak için biraz zaman geçirdim, bu mutlak bir kabus. Hayat 6 yıl önce daha basitti :-)
michael aubert

Sadece kısa bir soru parti kaçırdı, sanırım ilk sürümünden başlamak için çok daha rahatlatıcı (ve belki de yararlı) olurdu? Aslında bunu büyük projelerin tüm ciddi kod okuma için yapmalıyım?
Nicholas Humphrey

7

HSQLDB'den öğrenebilirsiniz . Sanırım öğrenme için küçük ve basit bir veritabanı sunuyorlar. açık kaynak olduğu için kodlara bakabilirsiniz.


3

Gereksinimlerinize uygun olup olmadığından emin değilim ama SELECT, INSERT , UPDATEperl kullanarak simple ( ) desteği ile basit bir dosya odaklı veritabanı uygulamıştım .
Yaptığım her tabloyu diskte bir dosya olarak ve iyi tanımlanmış bir desene sahip girişler olarak sakladım ve awk ve sed gibi yerleşik linux araçlarını kullanarak verileri manipüle ettim. verimliliği artırmak için sık erişilen veriler önbelleğe alınmıştır.


1
hala kod var mı, u bir bağlantı paylaşabilir
miyim

3

MySQL sizi ilgilendirirse, MySQL'in nasıl çalıştığı hakkında bilgi sahibi olan bu wiki sayfasını da öneririm . Ayrıca, MySQL Internals'ı Anlama konusuna da göz atmak isteyebilirsiniz .

Veritabanı motorunuz için SQL olmayan bir arayüze bakmayı da düşünebilirsiniz. Lütfen Apache CouchDB'ye bakınız . Onun adı ne, belge odaklı bir veritabanı sistemi.

İyi şanslar!


Eğer başka bir db bakmak istiyorsanız: sqlserverinternals.com SQl sunucu iç onun nbooks üst-nitch vardır.
HLGEM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.