Utwórz własny system bazy danych [zamknięty]

65

Muszę się nauczyć, jak działają bazy danych, aby móc je efektywniej wykorzystywać, a moim sposobem uczenia się jest robienie.

Chcę stworzyć własny system bazy danych. Nie mam na myśli tworzenia pseudo-bazy danych, która użyłaby zapytania do parsowania plików; byłby to po prostu interfejs systemu plików z językiem zapytań. Mówię o rzeczywistej strukturze silnika bazy danych. A ponieważ to, co mam na myśli, nie jest ani oparte na relacjach, ani na dokumentach (jest „zorientowane na węzły”, jeśli to w ogóle istnieje), potrzebowałbym dowolnego zasobu, aby był jak najbardziej abstrakcyjny i na najwyższym poziomie.

Jak więc mógłbym to zrobić? Jakie zasoby / tutoriale / książki mogę przeczytać, aby zrozumieć?

Język nie ma najmniejszego znaczenia. Najlepiej byłoby, gdyby kod był pseudo-kodem ilustrującym pojęcie, niepowiązanym z konkretnym językiem, ale cokolwiek by to zrobiło. Nie byłem w stanie znaleźć niczego w tej sprawie w Google (ponieważ jestem tak niepiśmienny w tym temacie, może po prostu nie wpisuję właściwego wyszukiwania).

Jeśli takie zasoby nie są dostępne, myślę, że coś o tym, jak stworzyć klienta, byłoby przynajmniej krokiem we właściwym kierunku.

Xananax
źródło
15
Dlaczego zamiast tego nie napisać kompilatora? A nawet lepiej, własny system operacyjny? Jeśli naprawdę poważnie podchodzisz do pisania własnej bazy danych, istnieje tysiące baz danych typu open source: przestudiuj ich kod źródłowy, dodaj kilka poprawek. Następnie zacznij myśleć o budowie własnego.
yannis,
4
Możesz wziąć udział w kursach bazy danych na poziomie uczelni lub absolwenta. Istnieje wiele kursów open source online. Możesz także kupić kilka podręczników i studiować je w wolnym czasie. To da ci kilka pomysłów i punktów wyjścia. Pomoże również czytanie historii i nowości na temat PostgreSQL (pod względem wyobraźni, chociaż nie da ci żadnego pojęcia, jak te funkcje są faktycznie wdrażane)
rwong
9
I studied open-source DBs, but their codebase is too huge: Jeśli coś takiego jak redis lub flockdb jest zbyt duże, aby je czytać, nie rozumiem, jak poradzisz sobie z pisaniem lub własną bazą danych.
yannis
10
@YannisRizos Szczerze mówiąc, czytanie kodu (imo) jest znacznie trudniejsze niż pisanie go samemu.
AlexWebr
12
@Xananax: nie słuchaj żab ( crystal-reflections.com/stories/story_73.htm ). Rób, co lubisz i nie musisz mieć celu czerpania przyjemności z tego procesu.

Odpowiedzi:

61

(jest „zorientowany na węzły”, jeśli to w ogóle istnieje)

Zacznij tutaj. Podczas pracy ze złożoną aplikacją, taką jak baza danych (nawet prosta baza danych jest złożoną aplikacją), powinieneś zapoznać się z historią domeny i właściwą terminologią oraz mieć przynajmniej bardzo wysoki poziom wiedzy o architekturze. Możesz zacząć od artykułu w Wikipedii na temat bazy danych . Spędziłem kilka dni czytając wszystkie artykuły na temat powiązanych pojęć i różnych typów baz danych.

A ponieważ to, co mam na myśli, nie jest ani relacyjne ani zorientowane na dokumenty

Następnie wybierz Relacyjny lub NoSQl. Jeśli wybierzesz NoSQL, powinieneś wybrać jeden typ NoSQL. To niezwykle ważne, nie znajdziesz żadnych dokumentów architektonicznych omawiających wszystkie różne rodziny baz danych. Tak naprawdę nie ma znaczenia, który wybierzesz, po prostu wybierz jeden i trzymaj się go.

Język nie ma najmniejszego znaczenia.

Tak, robi to (niestety), ponieważ po wybraniu rodziny baz danych powinieneś zacząć eksplorować kod z baz danych open source tej rodziny. Istnieje kilka ogólnych wskazówek na temat tego, czego szukać:

  • Stosunkowo niewielka baza kodu,
  • Dokumenty architektoniczne lub przynajmniej blog programistyczny,
  • Wybrana baza danych powinna być zbliżona do tego, co w rodzinie jest uważane za ogólne, trudniej byłoby się nauczyć, jeśli jest wysoce wyspecjalizowane.

Kilka pasujących przykładów:

Zdobądź źródło, skompiluj je i baw się nim. Nie musisz przesyłać poprawek ani czegokolwiek innego, po prostu zapoznaj się z kodem i wprowadzaj niewielkie zmiany tu i tam, aby zobaczyć, co się stanie. Jest to proces przyrostowy, im więcej się nim bawisz, tym łatwiej będzie zrozumieć, co robi kod. Jeśli pierwszy wybrany projekt wydaje się niezwykle trudny do zrozumienia, przejdź do następnego.

Inną świetną opcją byłoby skoncentrowanie się na budowie silnika dla MySQL, jak sugeruje @NB we wcześniejszej odpowiedzi .

Jeśli osiągniesz punkt, w którym możesz zrobić coś pożytecznego z bazą kodu, zaangażuj się w społeczność projektu, to najłatwiejszy sposób na znalezienie bardziej szczegółowych zasobów na temat pojęć.

A potem wreszcie zacznij pracować nad bazą danych. Na początku możesz po prostu napisać bardzo pomniejszonego klona kodu, który eksplorujesz. To nie musi być oryginalne, całkiem sporo świetnych projektów powstało jako klony lub widelce.

Jakie zasoby / tutoriale / książki mogę przeczytać, aby zrozumieć?

Jest całkiem sporo książek:

I kilkaset innych, a także mnóstwo prac naukowych, które można łatwo prześledzić za pośrednictwem Google. Najpierw musisz zdefiniować, co chcesz zrobić, a następnie wyszukać książkę. Zaangażowanie się w społeczność innych autorów baz danych pomoże również zawęzić listę książek i być może uzyskać znacznie lepsze sugestie niż powyższe.

Powodzenia! Po zakończeniu oczekuję komentarza z linkiem do Twojego repozytorium. A jeśli nigdy nie skończyłeś, upewnij się, że zostawiłeś komentarz przypominający mi, że wciąż nie skończyłem kompilatora, który zacząłem pisać w 2001 roku.

Yannis
źródło
5
to jest fajny post
Chani,
2
To jest super! Jeszcze więcej od ciebie :) Chciałbym zaakceptować prawie każdą odpowiedź, ale skoro muszę wybrać jedną, to musi być ona. I'm expecting a comment with a link to your repository when you're done: z całą pewnością! Jeszcze raz dziękuję Tobie i wszystkim innym, to było naprawdę podnoszące na duchu.
Xananax,
3
I dla każdego, kto tu przychodzi i szuka tych samych odpowiedzi: flockDB jest najlepszym kandydatem do nauki, podstawa kodu jest naprawdę niewielka, kod bardzo czytelny (chociaż nie mówię po scala) i łatwy do zrozumienia.
Xananax,
@Yannis, Btw, które z polecanych przez ciebie książek to te, które przeczytałeś?
Pacerier
@Xananax Sooo, jak leci? Jakieś repozytorium, na które możemy spojrzeć? :)
Radu Murzea
27

Powinieneś to po prostu zrobić i przestać myśleć za dużo. Cieszy proces uczenia się i entuzjazm to prezenty.

Pytanie innych, czy to dobry pomysł, z pewnością nie jest dobrą strategią . Gdybym słuchał wszystkich żab, nadal pracowałbym dzisiaj w Ikea, pchając wózek z parkingu do magazynu.

Nie musisz usprawiedliwiać się tak, jak zrobiła to Ayende w tym ciekawym poście . Pytanie brzmiało:

Jednak jako pragmatyczny programista zastanawiam się, co nowego oferuje ten projekt na nasyconym rynku, na którym masz dość dojrzałe alternatywy, takie jak CouchDB, MongoDB, Tokio, Redis i wiele innych? Wiele z tych produktów jest również wieloplatformowych i działa z prędkością C ze sprawdzonym rekordem, używanych na bardzo dużych stronach internetowych, gdzie ich możliwości dzielenia i odporność na uszkodzenia zostały znacznie zwiększone.

Jeśli czerpiesz przyjemność z tego procesu, nie martw się o cel, który już wygrałeś.


źródło
4
+1, bardzo przemyślana i pouczająca odpowiedź :-) ... naprawdę fajna odpowiedź dla kogoś, kto chce coś zrobić
Pankaj Upadhyay
Naprawdę bardzo ładnie. Byłem bliski przyjęcia tego. Nie zrobiłem tego, ponieważ myślałem, że odpowiedź Yannisa jest bardziej trafna i bardziej prawdopodobna, aby pomóc ludziom zadającym to samo pytanie. Ale to zdecydowanie zachęcało. Wielkie dzięki.
Xananax,
Odpowiedź Yannisa jest lepsza niż moja i zasługuję na twój wybór
6

„(jest„ zorientowany na węzły ”, jeśli to w ogóle istnieje)”. - Może dlatego nie znajdujesz wiele!

Zanurz się w wersji 0.1 i zobacz, gdzie się znajdziesz. Możesz dowiedzieć się więcej, próbując wyprodukować to, czego chcesz, od pytania, co „powinieneś” zrobić. Daj mu kilka dni, a następnie sprawdź, gdzie jesteś.

Około 18 lat temu napisałem podstawowy system baz danych (dla zabawy, idź figura) z indeksami btree i nauczyłem się bardzo dużo.

Jaydee
źródło
4

MySQL ma wbudowaną strukturę silnika pamięci masowej, może być pomysł, aby sprawdzić, jak silniki są tworzone do pracy dla MySQL.

Mjh
źródło
4

Brzmi jak świetny projekt. Najwyraźniej twoim celem nie jest stworzenie oprogramowania produkcyjnego, ale poznanie baz danych i procesu tworzenia systemu baz danych.

Nie sądzę, żebyś musiał przeprowadzić wiele badań. Wydaje się, że celem jest zdobycie doświadczenia w tworzeniu systemu baz danych opartego na węzłach.

Oto jak zacznę:

  1. Wybierz swój ulubiony język lub język, który chcesz poprawić.
  2. Utwórz obiekt węzła (lub cokolwiek najbliższego w twoim języku). Dowiedz się, jak je połączyć.
  3. Zrób krótką listę instrukcji SQL, które najpierw zaimplementujesz.
  4. Zdecyduj, jak zapisać dane. Jednym oczywistym rozwiązaniem jest serializacja wszystkich węzłów, ładowanie ich podczas uruchamiania programu i zapisywanie ich po zakończeniu programu.

Po uruchomieniu podstaw uzyskasz lepszy wgląd w to, co trudne lub problematyczne. Następnie możesz przeprowadzić na ten temat badania, znaleźć ulepszenia i zintegrować je.

B Seven
źródło
1
Postępuję zgodnie z zaleceniami. 1,2,3 to żaden problem. Jestem jednak zaskoczony przez # 4. W przypadku dużej ilości danych, w jaki sposób ładowałbym do pamięci tylko odpowiednie części? Myślałem o przechowywaniu wszystkiego jako danych binarnych i przechowywaniu innego pliku indeksu, ale co, jeśli użytkownik nie będzie wyszukiwał według indeksu? Nadal musiałbym przeglądać cały plik ... Myślę, że czas na kolejne pytanie
Xananax,
Dlaczego nie przechowywać wszystkiego w pamięci? Jeśli poświęcisz 1 GB, pomieści to dużo danych. Alternatywnie przechowuj każdy węzeł danych binarnych na dysku, a wtedy będziesz miał 1 GB na tekst. To dużo tekstu. W każdym razie myślę, że obsługa bazy danych większej niż 1 GB nie jest najważniejsza w tym ćwiczeniu.
B Siedem,
Możesz także utworzyć wiele metod wydajnej pracy w obrębie 1 GB pamięci. Później możesz ulepszyć tę część systemu. Jednym z rozwiązań jest załadowanie wszystkich informacji o węźle do pamięci, ale zapisanie danych każdego węzła na dysku. W ten sposób możesz skutecznie przechodzić przez węzły i uzyskiwać dostęp do dysku tylko w celu odzyskania potrzebnych danych.
B Siedem,
3

Jedynym dobrym powodem jest pisanie własnej bazy danych „aby zrozumieć, jak to wszystko działa” (ponieważ bazy danych są szalone, trudne do poprawienia i trudne do udowodnienia). Jesteś szalony, ale w dobry sposób!

Aby zobaczyć, jak to się robi, proponuję spojrzeć na SQLite. Source SQLite jest tylko około 1.3MB skompresowany, i jest to w pełni zgodne z ACID-baza danych transakcyjnych. Jest to również domena publiczna, a główny autor to miły facet, który z pewnością chętnie odpowie na twoje pytania. (Myślę, że najtrudniejsze są fragmenty, jak naprawdę przekazywać informacje na dysk; przekonanie systemów operacyjnych i sprzętu, aby przestały kłamać i naprawdę napisały transakcję TERAZ, jest zaskakująco trudne i dlatego cieszę się, że nigdy nie muszę pisać DB.)

Donal Fellows
źródło
1
Baza kodów SQLite zbliża się do 0,2 * 10 ^ 6 loc (5 MB zdekompresowane), nie jest tak mała.
yannis
1
@Yannis: Porównaj z MySQL lub PostgreSQL lub dowolnym innym systemem DB serwera…
Donal Fellows
3

Muszę się dowiedzieć, jak działają bazy danych

Naucz się algebry relacyjnej.

Znajdź mały silnik DB, poznaj źródło.

w celu bardziej efektywnego ich wykorzystania

Nie. Musisz nauczyć się efektywnie korzystać z bazy danych. Możesz być lepszym kierowcą, jeśli rozumiesz, jak działa Twój samochód, ale będziesz znacznie lepszym kierowcą, jeśli naprawdę skoncentrujesz się na jeździe.

Wybierz tradycyjne trasy: wybierz się na kurs, poczytaj książkę, recenzuj, zadawaj pytania, użyj indeksu luke .

Incognito
źródło
5
Learn relational algebra.Zakładając, że op jest zainteresowany relacyjnymi bazami danych oczywiście ...
yannis,