Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.programming > #32138 > unrolled thread
| Started by | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| First post | 2018-12-22 14:54 +0100 |
| Last post | 2018-12-24 19:16 +0100 |
| Articles | 6 — 2 participants |
Back to article view | Back to pl.comp.programming
Projektowanie bazki danych Borneq <borneq@antyspam.hidden.pl> - 2018-12-22 14:54 +0100
Re: Projektowanie bazki danych szykcech@gmail.com - 2018-12-22 12:09 -0800
Re: Projektowanie bazki danych Borneq <borneq@antyspam.hidden.pl> - 2018-12-23 13:49 +0100
Re: Projektowanie bazki danych Borneq <borneq@antyspam.hidden.pl> - 2018-12-23 17:09 +0100
Re: Projektowanie bazki danych Borneq <borneq@antyspam.hidden.pl> - 2018-12-24 14:09 +0100
Re: Projektowanie bazki danych Borneq <borneq@antyspam.hidden.pl> - 2018-12-24 19:16 +0100
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2018-12-22 14:54 +0100 |
| Subject | Projektowanie bazki danych |
| Message-ID | <pvlfmg$5a5$1@node2.news.atman.pl> |
Myślałem aby w celach edukacyjnych zaprojektować i napisać silnik
miniaturowej bazy danych.
Jest taka ciekawa książka: "Systemy baz danych. Kompletny podręcznik." -
Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom.
Na początku wyszła sprawa endianu. Zdawało by się że to sprawa typowo
uznaniowa - na Intelu lepiej użyć Little Endian, i w zależności od
języka w C++ - Little, w Javie - Big Endian.
Skoro piszę dla Intela w C++ do raczej Little Endian,
ale
mam coś takiego jak klucz główny, w najprostszym przypadku będzie to
liczba 64-bitowa, czyli 8 bajtów, ale klucze mogą być różnej długości i
kluczem może być napis, który odczytujemy od lewej do prawej.
Aby nie było konfliktów z kluczami liczbowymi i napisowymi,trzeba jednak
wybrać Big Endian.
Druga sprawa: dostęp do rekordu jest bardzo szybki o ile jest on w
pamięci, ale wiadomo że wszystkiego nie będzie w pamięci, jak sobie w
takim przypadku radzić?
Trzecia rzecz: zamiast jednego programu Exe, należało by rozbić na
serwer i klienty. Jak by mogły się komunikować zwłaszcza na różnych
komputerach w obrębie sieci lokalnej? Co użyć? może Kafkę?
[toc] | [next] | [standalone]
| From | szykcech@gmail.com |
|---|---|
| Date | 2018-12-22 12:09 -0800 |
| Message-ID | <ee2f6f10-22b4-4841-b08b-cf721b3afa64@googlegroups.com> |
| In reply to | #32138 |
Nie znam się na implementacji transakcyjnych baz danych, ale się wypowiem: > mam coś takiego jak klucz główny, w najprostszym przypadku będzie to > liczba 64-bitowa, czyli 8 bajtów, ale klucze mogą być różnej długości i > kluczem może być napis, który odczytujemy od lewej do prawej. > Aby nie było konfliktów z kluczami liczbowymi i napisowymi,trzeba jednak > wybrać Big Endian. Spadek prędkości będzie tylko przy zapisie. Przy pobieraniu danych będzie trzeba też konwertować parametry zapytań. > Druga sprawa: dostęp do rekordu jest bardzo szybki o ile jest on w > pamięci, ale wiadomo że wszystkiego nie będzie w pamięci, jak sobie w > takim przypadku radzić? A słyszał Ty o "wyszukiwaniu zewnętrznym" i B-drzewach?!? W starej książce "Algorytmy w C++" Roberta Sedgewicka wydanej w Polsze 1999 przez wydawnictwo RM jest na końcu rozdział (16) o tym. > Trzecia rzecz: zamiast jednego programu Exe, należało by rozbić na > serwer i klienty. Jak by mogły się komunikować zwłaszcza na różnych > komputerach w obrębie sieci lokalnej? Co użyć? może Kafkę? Protokół musisz wybrać lub zaprojektować sam... W każdym razie: powodzonka - bo bardzo się przyda... Szyk Cech
[toc] | [prev] | [next] | [standalone]
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2018-12-23 13:49 +0100 |
| Message-ID | <pvo08p$f3f$1@node1.news.atman.pl> |
| In reply to | #32139 |
W dniu 22.12.2018 o 21:09, szykcech@gmail.com pisze: > A słyszał Ty o "wyszukiwaniu zewnętrznym" i B-drzewach?!? W starej książce "Algorytmy w C++" Roberta Sedgewicka wydanej w Polsze 1999 przez wydawnictwo RM jest na końcu rozdział (16) o tym. Właśnie czytam o B-drzewch w książce Moliny - najciekawszy rozdział. Indeks może zmieścić się w pamięci cały, tym niemniej co gdy będziemy chcieli wykonać select * from table where warunek_jakis limit 1000 ? Będziemy mieli 1000 wskaźników na rekordy, które mogą być porozrzucane. Jak zrobić B-drzewo: otóż mam blok pamięci w a nim kolejno: key0,ptr0,key1,ptr1,key2,ptr2,...keyn,ptrn, jeśli wartość będzie pomiędzy key1 a key2 to szukamy bloku ptr1 szczegóły implementacyjne: optymalną wielkością dla bloku będzie 4 kiB, jest to wielkość która pokrywa się z wielkością sektora dyskowego czy 2^n sektorów, klastrem dyskowym oraz z wielkością wymiany pamięć-dysk Intela. Wielkość wskaźników to 8 bajtów, klucze w najprostszej postaci to też 8 bajtów (mógłby być przypadek, że klucz to pole char(40), można się zająć tym później) 4096 bajtowy blok miałby 8 bajtowy nagłówek, reszta podzielona była by na sloty (klucz,pointer). Wynika że maksymalnie tych slotów mogło by być 255, czyli dobrze się składa, bo ilość slotów zapiszemy w 1 bajcie w nagłówku. Teraz należy przy dodawaniu pomyśleć, aby b-drzewo było mniej więcej wyważone.
[toc] | [prev] | [next] | [standalone]
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2018-12-23 17:09 +0100 |
| Message-ID | <pvobv6$q62$1@node1.news.atman.pl> |
| In reply to | #32140 |
W dniu 23.12.2018 o 13:49, Borneq pisze: > Jak zrobić B-drzewo: > otóż mam blok pamięci w a nim kolejno: > key0,ptr0,key1,ptr1,key2,ptr2,...keyn,ptrn, > jeśli wartość będzie pomiędzy key1 a key2 to szukamy bloku ptr1 Natrafiłem na ciekawą stronkę: https://www.cs.usfca.edu/~galles/visualization/BTree.html nie bardzo widzę różnicę dla Preemtive Split / Merge (Even max degree only) dla przykładów które zrobiłem, było identycznie.
[toc] | [prev] | [next] | [standalone]
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2018-12-24 14:09 +0100 |
| Message-ID | <pvqlpv$ulq$1@node2.news.atman.pl> |
| In reply to | #32141 |
W dniu 23.12.2018 o 17:09, Borneq pisze: > Natrafiłem na ciekawą stronkę: > https://www.cs.usfca.edu/~galles/visualization/BTree.html > nie bardzo widzę różnicę dla > Preemtive Split / Merge (Even max degree only) > dla przykładów które zrobiłem, było identycznie. Dla większych przykładów widać różnicę dla preemptive, ale weźmy 0725 0816 0767 0557 0205 0558 0905 0441 0976 dla max degree = 3 (nieparzysty stopień, więc nie można preemptive) oczekiwałbym że najniższy poziom - liście to będą wskaźniki do danych, więc wszystkie klucze powinny być w liściach? a co gdy chcę znaleźć dane dla kluczy 0767,557 czy 0905? Coś jeszcze B-tree jest niejasne.
[toc] | [prev] | [next] | [standalone]
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2018-12-24 19:16 +0100 |
| Message-ID | <pvr7q8$fah$1@node2.news.atman.pl> |
| In reply to | #32143 |
W dniu 24.12.2018 o 14:09, Borneq pisze: > W dniu 23.12.2018 o 17:09, Borneq pisze: >> Natrafiłem na ciekawą stronkę: >> https://www.cs.usfca.edu/~galles/visualization/BTree.html Przyglądam się zaawansowanej implementacji: https://github.com/myui/btree4j prefiksowane B-drzewa są w : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.800.1242&rep=rep1&type=pdf ALE: oszczędność jest ważna tylko do liści, bo wyższe poziomy będą naprawdę miniaturowe. Dla jednego bloku liścia klucze mogą różnić się bardzo mało: np. od abcaa do abcaz, wtedy klucz abca dotyczyłby całego bloku, a klucze byłyby samymi literami a,b,c,...z jednak: nie mogą to być pojedyncze litery, ponieważ klucz może być abcac5225245hg i tak większość klucza musiała by być w indeksie, aby była możliwość stwierdzenia czy klucz taki istnieje. Można zamiast klucza trzymać hasz klucza, wtedy można stwierdzić brak istnienia klucza w bloku,ale aby stwierdzić że na pewno istnieje trzeba by przeczytać dane. A jak się ma sprawa wskaźników?: inaczej niż klucze, mogą sąsiadować całkiem różne, oddalone od siebie, choć dobrze by było aby wszystkie odnosiły się do tego samego megabajta, wtedy nie trzeba by dla jednego bloku wykonywać kilkaset razy seek(). I tu jest właśnie problem: Mam duży plik i wrzucam w losowej kolejności dane, wrzucam na koniec i uaktualniam B-drzewo. Teraz operacja dodawania nowej kolumny: czy trzeba wszystkie dane rozsuwać? Może tak: jedna kolumna - jeden plik?
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.programming
csiph-web