eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Projektowanie bazki danych
Ilość wypowiedzi w tym wątku: 6

  • 1. Data: 2018-12-22 14:54:22
    Temat: Projektowanie bazki danych
    Od: Borneq <b...@a...hidden.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ę?


  • 2. Data: 2018-12-22 21:09:49
    Temat: Re: Projektowanie bazki danych
    Od: s...@g...com

    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


  • 3. Data: 2018-12-23 13:49:29
    Temat: Re: Projektowanie bazki danych
    Od: Borneq <b...@a...hidden.pl>

    W dniu 22.12.2018 o 21:09, s...@g...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.


  • 4. Data: 2018-12-23 17:09:10
    Temat: Re: Projektowanie bazki danych
    Od: Borneq <b...@a...hidden.pl>

    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.


  • 5. Data: 2018-12-24 14:09:21
    Temat: Re: Projektowanie bazki danych
    Od: Borneq <b...@a...hidden.pl>

    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.


  • 6. Data: 2018-12-24 19:16:38
    Temat: Re: Projektowanie bazki danych
    Od: Borneq <b...@a...hidden.pl>

    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?

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: