Kendi veritabanı sistemimi oluştur [kapalı]


65

Veritabanlarının onları daha verimli kullanmak için nasıl çalıştığını öğrenmem gerekiyor ve öğrenme yolum da bunu yapmak.

Kendi veritabanı sistemimi oluşturmak istiyorum. Dosyaları ayrıştırmak için sorgu kullanacak bir sözde veritabanı oluşturmaya atıfta bulunmadım; bu sadece bir sorgu dili ile bir dosya sistemi arayüzü olacaktır. Bir veritabanı motorunun gerçek yapısı hakkında konuşuyorum. Akılda bulunduğum şey ilişkisel ya da doküman odaklı olmadığından (bu “düğüm odaklı”, eğer varsa bile), herhangi bir kaynağa mümkün olduğu kadar soyut ve üst düzeyde olmak isterim.

Öyleyse, onu yaratmaya nasıl giderim? Anlamak için hangi kaynakları / öğreticileri / kitapları okuyabilirim?

Dil en ufak bir sorun değil. İdeal olarak, kod belirli bir dile bağlı olmayan, ancak herhangi bir şeyin yapacağı kavramı göstermek için sözde kod olacaktır. Google'da konuyla ilgili hiçbir şey bulamadım (konuyla ilgili okuma yazma bilmediğimden, belki de doğru aramaya girmiyorum).

Eğer bu tür kaynaklar mevcut değilse, o zaman bir müşterinin nasıl yaratılacağı hakkında en azından doğru yönde bir adım olacağını tahmin ediyorum.


15
Neden bunun yerine derleyici yazmıyorsunuz? Ya da daha iyisi, kendi işletim sisteminiz? Kendi veritabanınızı yazma konusunda gerçekten ciddiyseniz, dışarıda binlerce tane açık kaynak veritabanı var: Kaynak kodlarını inceleyin, birkaç yamaya katkıda bulunun. O zaman kendin yapmayı düşünmeye başla.
yannis

4
Bazı kolej ve lisansüstü seviye veritabanı derslerini alabilirsiniz. Çevrimiçi birçok açık kaynak kursları var. Ayrıca birkaç ders kitabı satın alabilir ve boş zamanlarında okuyabilirsiniz. Bu size bazı fikirler ve başlangıç ​​noktaları verecektir. PostgreSQL'in tarihini ve haberlerini okumak da yardımcı olacaktır (hayal gücü açısından, bu özelliklerin gerçekte nasıl uygulandığına dair hiçbir fikir
vermese de

9
I studied open-source DBs, but their codebase is too huge: Redis veya flockdb gibi bir şey okumak için çok büyükse , yazma veya kendi veritabanını nasıl başa çıkacağınızı anlamıyorum.
yannis

10
@YannisRizos Adalet, kod (imo) okumak, kendiniz yazmaktan çok daha zordur.
AlexWebr

12
@ Xananax: kurbağaları dinlemeyin ( crystal-reflections.com/stories/story_73.htm ). İstediğinizi yapın ve bu süreçte zevk almayı hedefleyen bir hedefiniz olması gerekmez.

Yanıtlar:


61

(eğer varsa bile "düğüm odaklı" dır)

Buradan başlayın. Bir veritabanı gibi karmaşık bir uygulama ile uğraşırken (basit bir veritabanı bile karmaşık bir uygulamadır), etki alanı tarihine ve uygun terminolojiye aşina olmanız ve en azından mimarlık hakkında en üst düzeyde bir fikre sahip olmanız gerekir. Veritabanındaki Wikipedia makalesinden başlayabilirsiniz . İlgili kavramlar ve farklı veritabanı türleri hakkındaki tüm yazıları okuyarak birkaç gün geçirdi.

Aklımdaki şey ne ilişkisel ne de belge odaklı olmadığından

Ardından, Relational veya NoSQl seçimini yapın. NoSQL seçerseniz, bir tür NoSQL seçmelisiniz. Bu son derece önemlidir, tüm farklı veritabanı ailelerini tartışan hiçbir mimari belge bulamazsınız. Hangisini seçtiğiniz gerçekten önemli değil, sadece birini seçin ve buna bağlı kalın.

Dil en ufak bir sorun değil.

Evet öyle (maalesef), çünkü bir veritabanı ailesi seçtikten sonra kodu bu ailenin açık kaynaklı veritabanlarından keşfetmeye başlamalısınız. Neye bakmanız gerektiğine dair birkaç genel kural vardır:

  • Nispeten küçük kod temeli,
  • Mimari belgeler veya en azından bir geliştirme blogu,
  • Seçtiğiniz veritabanı, ailede genel olarak kabul edilenlere yakın olmalıdır, çok özel olup olmadığını öğrenmek zor olacaktır.

Uygun birkaç örnek:

Kaynağı alın, derleyin ve oynayın. Yamalar veya hoş bir şey göndermek zorunda değilsiniz, sadece kodu inceleyin ve burada ve orada ne olacağını görmek için küçük değişiklikler yapın. Bu artan bir işlemdir, onunla ne kadar çok oynarsanız, kodun ne yaptığını anlamak o kadar kolay olacaktır. Seçtiğiniz ilk projeyi anlamak oldukça zor görünüyorsa, bir sonrakine geçin.

Bir başka harika seçenek de, @NB'nin daha önceki bir cevabın önerdiği gibi, MySQL için bir motor inşa etmeye yoğunlaşmak olacaktır .

Kod temeli ile yararlı bir şey yapabileceğiniz bir noktaya ulaşırsanız, projenin topluluğuna katılın, ilgili kavramlar hakkında daha ayrıntılı kaynaklar bulmanın en kolay yolu budur.

Sonra nihayet veritabanında çalışmaya başla. İlk başta, araştırmakta olduğunuz kodun oldukça küçük bir klonunu yazabilirsiniz. Orijinal olması gerekmiyor, klon veya çatal olarak başlatılan birkaç harika proje var.

Anlamak için hangi kaynakları / öğreticileri / kitapları okuyabilirim?

Oldukça az sayıda kitap var:

Birkaç yüz kişi daha, ayrıca Google üzerinden kolayca izleyebileceğiniz sayısız akademik makale. Önce ne yapmak istediğinizi tanımlamanız ve sonra bir kitap aramanız gerekir. Veri tabanı yazarlarından oluşan bir topluluğa katılmak, kitap listesini daraltmanıza ve belki de yukarıdakilerden çok daha iyi öneriler almanıza yardımcı olacaktır.

İyi şanslar! İşiniz bittiğinde havuzunuzun bağlantısını içeren bir yorum bekliyorum. Ve eğer hiç bitmediyse, 2001 yılında yazmaya başladığım derleyiciyi hala tamamlamadığımı hatırlatan bir yorum bıraktığınızdan emin olun.


5
bu güzel yazı
Chani

2
Bu süper! Sizden daha da fazla gelmek :) Neredeyse birbirimizin cevabını kabul etmek isterdim, ancak bir tane seçmem gerektiğinden, bu böyle olmalı. I'm expecting a comment with a link to your repository when you're done: kesinlikle! Tekrar teşekkürler, size ve herkese, bu gerçekten canlandırıcıydı.
Xananax

3
Ve aynı cevapları arayanlar için buraya gelen herkes için: flockDB'yi öğrenmek için en iyi aday olarak buluyorum, kod temeli gerçekten küçük, kod çok okunaklı (skala konuşmasam da) ve anlaşılması kolay.
Xananax

@Yannis, Btw hangi kitaplardan hangisini okudun?
Pacerier

@ Xananax Sooo nasıl gidiyor? Bakabileceğimiz herhangi bir depo var mı? :)
Radu Murzea 29:16

27

Sadece yapmalısın ve fazla düşünmeyi bırakmalısın. Öğrenme sürecinden zevk almak ve coşku hediyelerdir.

Başkalarına bunun iyi bir fikir olup olmadığını sormak kesinlikle iyi bir strateji değildir . Bütün kurbağaları dinleseydim, bugün hala alışveriş sepetini otoparktan depoya itmek için Ikea'da çalışacaktım.

Ayende'nin bu ilginç yazıdaki gibi haklı çıkarmanıza gerek yok . Soru şuydu:

Ancak pragmatik bir geliştirici olarak, bu projenin CouchDB, MongoDB, Tokyo, Redis ve daha pek çok alternatif seçeneğinizin olduğu doymuş bir pazarda sunduğu yenilikleri merak ediyorum. Bu ürünlerin birçoğu da çapraz platformdur ve kanıtlanmış bir rekor ile C hızında çalıştırılır, bu da paylaşım yeteneklerinin ve hata toleranslarının çok fazla olduğu çok büyük web sitelerinde kullanılır.

Sürecin tadını çıkarırsanız, amaç hakkında endişelenmeyin, çoktan kazandınız.


4
+1, çok düşünceli ve öğretici cevap :-) ... bir şeyler yapmak isteyen birine gerçekten güzel cevap
Pankaj Upadhyay

Gerçekten çok iyi. Bunu kabul etmenin eşiğindeydim. Yannis'in cevabının konuya daha fazla geldiğini ve insanların aynı soruyu bulmalarına yardımcı olma ihtimalinin daha yüksek olduğunu düşündüğüm için yapmadım. Ancak bu kesinlikle cesaret vericiydi. Çok teşekkürler.
Xananax

Yannis cevabı benimkinden daha iyi ve seçiminizi hakediyor

6

"(eğer" varsa "düğüm odaklı"). - Bu yüzden fazla bir şey bulamıyorsun!

0.1 sürümü ile dalın ve nereden aldığınızı görün. Ne yapman gerektiğini sormaktan istediğini üretmeye çalışmaktan daha fazla şey öğrenebilirsin. Birkaç gün verin ve daha sonra sahip olduğunuz yeri inceleyin.

Yaklaşık 18 yıl önce btree endeksleri ile temel bir veritabanı sistemi yazdım (eğlence için, rakam). Çok şey öğrendim.



4

Harika bir proje gibi geliyor. Anlaşılan amacınız bir üretim yazılımı oluşturmak değil, veritabanları ve veritabanı sistemi oluşturma süreci hakkında bilgi sahibi olmak.

Çok fazla araştırma yapmanız gerektiğini düşünmüyorum. Amaç, düğüm tabanlı bir veritabanı sistemi oluşturmada neler yaşandığını tecrübe etmektir.

İşte nasıl başlayacağım:

  1. Favori dilinizi veya geliştirmek istediğiniz dili seçin.
  2. Düğüm nesnesini (veya kendi dilinizde en yakın olanı) oluşturun. Onları nasıl bağlayacağınızı düşünün.
  3. Önce uygulayacağınız SQL ifadelerinin kısa bir listesini yapın.
  4. Verilerin nasıl kaydedileceğine karar verin. Açık bir çözüm, tüm düğümleri serileştirmek, program başladığında onları yüklemek ve program sona erdiğinde onları kaydetmek.

Temelleri çalıştırdıktan sonra, neyin zor ya da problemli olduğu hakkında daha fazla bilgi edinebilirsiniz. O zaman bunun hakkında biraz araştırma yapabilir, bazı iyileştirmeler bulabilir ve bunları entegre edebilirsiniz.


1
Önerdiğin adımları takip ediyorum. 1,2,3 sorun değil. Ancak, # 4 tarafından güdük. Çok miktarda veri olması durumunda, sadece ilgili parçaları nasıl belleğe yüklerim? Her şeyi ikili veri olarak kaydetmeyi ve başka bir indeks dosyası tutmayı düşündüm, fakat kullanıcı indeks ile sorgulamıyorsa ne yapmalıyım? Hala tüm dosyaya bakmak zorunda kalacağım ... Sanırım başka bir soru zamanı
Xananax

Neden sadece her şeyi hafızada saklamıyorsun? 1 GB ayırırsanız, bu çok fazla veri tutar. Alternatif olarak, her bir ikili veri düğümünü diskte saklayın, ardından metin için 1 GB'ınız olur. Bu çok fazla metin. Her neyse, 1GB'tan daha büyük bir veritabanını kullanmanın alıştırmanın merkezi olmadığını düşünüyorum.
B Seven

Ayrıca, 1 GB bellek içinde verimli çalışmak için birçok yöntem oluşturabilirsiniz. Sistemin o bölümünü daha sonra geliştirebilirsiniz. Bir çözüm, tüm düğüm bilgilerini belleğe yüklemek, ancak her düğümün verilerini diskte depolamaktır. Bu şekilde düğümleri verimli bir şekilde geçirebilir ve yalnızca gerçekten ihtiyacınız olan verileri almak için diske erişebilirsiniz.
B Seven

3

Kendi veritabanınızı "her şeyin nasıl çalıştığını anlamak için" yazmak, bunu yapmak için tek iyi nedendir (çünkü veritabanları doğru olması zor ve doğru olduğunu kanıtlamak zor). Sen delisin, ama iyi bir şekilde!

Nasıl yapıldığını görmek için SQLite'a bakmanızı öneririm. SQLite kaynak 1.3MB sıkıştırılmış sadece yaklaşık olduğunu ve tamamen ASİT uyumlu işlemsel veritabanı var. Aynı zamanda kamu malı ve ana yazar iyi bir adam, sorularınızı cevaplamaktan mutluluk duyacağından eminim. (En zor parçaların diske gerçekten nasıl bilgi vereceğine inanıyorum; işletim sistemlerini ve donanımları yalan söylemeyi bırakıp işlemi gerçekten yazmaya ikna etmek ŞİMDİ şaşırtıcı derecede zor ve neden asla bir DB yazmak zorunda olmadığım için çok mutluyum.)


1
SQLite kod tabanı 0,2 * 10 ^ 6 loc'a (5mb sıkıştırılmış) yaklaşıyor, o kadar küçük değil .
yannis

1
@Yannis: MySQL veya PostgreSQL veya diğer sunucu DB sistemlerinden herhangi biriyle karşılaştırın…
Donal Fellows


3

Veritabanlarının nasıl çalıştığını öğrenmem gerekiyor

İlişkisel cebir öğrenir.

Küçük bir DB motoru bulun, kaynağını öğrenin.

onları daha verimli kullanmak için

Hayır! Bir veritabanını nasıl verimli kullanacağınızı öğrenmeniz gerekir. Aracınızın nasıl çalıştığını anlarsanız daha iyi bir sürücü olabilirsiniz, ancak gerçekten sürüşe odaklanırsanız daha iyi bir sürücü olacaksınız.

Geleneksel rotaları takip edin: bir kursa katılın, bir kitap okuyun, meslektaş incelemesi yapın, sorular sorun, indeks luke kullanın .


5
Learn relational algebra.
Op'nun
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.