Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-03-27 07:59:30

  lis6502 - Łowca lamerów

lis6502
Łowca lamerów
Skąd: Stalinogród
Zarejestrowany: 2008-12-04

Zaprojektowanie wydajnej bazy w sqlite

Hi. Z góry mówię że bazy od zawsze kojarzyły z sieciami i serwerami, dlatego taki dział ;)
A teraz pytajko.
Udało mi się ostatnio odświeżyć mirror jednego z moich ulubionych miejsc w sieci, mianowicie Modlanda (stuff dla nerdów lubiących elektroniczne brzmienia, do których posłuchania trzeba specjalnych playerów :P).
W sumie wyszło tego 94GB, zorganizowanych w następujący sposób:
[d]Format-
               -[d]Artysta
                               -[f]kawałek1
                               -[f]kawałek2
               -[d]InnyArtysta
[d]InnyFormat-

gdzie [d] to katalog a [f] plik.

Kod:

lis6502@Pulsar /mnt/nfs/work/modland/pub/modules $ find -type f |wc -l
462654

Wyszukiwanie za pomocą find to katorga (to w końcu dość trochę plików). Jeśli do tego dołożyć fakt, że nazwy się duplikują (bo każdy może napisać kawałek o nazwie love.xm), niektóre kawałki mają metadane (jak ID3), a i fajnie byłoby mieć sumy kontrolne poszczególnych plików (bo tak łatwiej zapanować nad kolekcją), to jasnym wydaje mi się że trzeba tu silnika bazodanowego, żeby wszystko uciągnąć.
Tutaj zaczynają się schody, ponieważ... cienkim w uszach w temacie baz ^^. Moim największym osiągnięciem było wyciągnięcie haseł z firefoxa sqlitemanagerem :P.

Zasięgnąwszy języka wśród znajomych (dobra, gadałem tylko z winnetou ;P) dowiedziałem się, że najoptymalniej byłoby rozłożyć poszczególne typy danych na tabele (czyli w jednej plik, w kolejnym polu np ścieżka dostępu; w kolejnej tabeli metadane; w kolejnej sumy etc).

Póki co będę sobie radził sqlitemanem (jakoś prościej uczyć mi się wyklikując opcje, jak będę duży, to będzie konsola :P), pytanie tylko jak spiąć cały pomysł w całość?
Sam doszedłem do czegoś takiego:
Tworzę tabelę PLIKOWE z trzema polami (NAZWA, SCIEZKA, ROZMIAR, ARTYCHA, FORMAT);
Tworzę tabelę SUMY z polami (MD5, SHA512, RMD160 [tak, używam gentoo ;)]);
Tworzę tabelę METADANE z polami (INSTRUMENTY, SAMPLE, KOMENTARZE).
Wiadomo, że sumy mogą się duplikować (nie wykluczam że prekursor kolekcji mógł wrzucić coś podwójnie), NAZWA też nie będzie unikalna. Jak spiąć to w całość, w sensie żeby, wrzuciwszy to w bazę, móc wyciągać dane ze wszystkich trzech tabel naraz, opisujące jeden plik ? Coś w deseń: zapytywuję o ARTYSTA='Jeroen Tel' ORAZ NAZWA='cybernoid*', w odpowiedzi dostaję przykładowo
NAZWA=cybernoid_original.mod, SCIEZKA=/Delitracker Custom/Jeroen Tel, ROZMIAR=65534, ARTYCHA=Jeroen Tel(MON), FORMAT=Protracker, MD5=(krzakiMD5), SHA512(krzaki)etc, INSTRUMENTY=4, SAMPLE=4, KOMENTARZE=Great song for great game
NAZWA=cybernoid2_ingame.cus, SCIEZKA(...)

Proszę o pomoc, bo przydałoby się coś wiedzieć w temacie baz (przy okazji ruszyłbym temat ;)),a i kolekcja też wymaga okiełznania ;)

Offline

 

#2  2011-03-27 09:14:32

  BiExi - matka przelozona

BiExi
matka przelozona
Skąd: Gorlice
Zarejestrowany: 2004-04-16
Serwis

Re: Zaprojektowanie wydajnej bazy w sqlite

Wiec tak tutaj jeszcze się pojawia pytanie czy 1 piosenka może mieć 2 artystów czy nie.
I zakładam że 1 piosenka to 1 plik ewentualnie do 1 pioseniki mogą być 2 sample

Wersja 1 piosenka = 1 artysta

Tabela ARTYSTA
Pola
id_artysta, nazwa, xya, imie, nazwisko, co_tam_jeszcze_potrzeba

Tabela KAWALEK
Pola
id_kawalek, id_artysta, tytul, opis, nazwa_pliku, katalog, md5
gdzie id_artysta to referencja na pole id_artysta w tabeli artysta

Tabela SAMPLE
Pole id_sample, id_kawalek, tytul, opis, nazwa_pliku, katalog, md5


I tak pola o których pisałeś nie muszą być unikatowe bo do tego stosuje się pola luczowe (id_kawalek, id_simple, id_artysta)

A teraz o wyjmowaniu danych z takich tabel najprościej tworzyć złączenia np:
SELECT artysta.xywa, kawalek.tytul, kawalek.plik FROM artysta
JOIN kawalek ON artysta.id_kawalek = kawalek.id_kawalek

Co do rozwiązania gdzie do 1 piosenki jest więcej jak 1 artysta to dochodzi nam jeszcze tabela laczaca

Tabela ARTYSTA
Pola
id_artysta, nazwa, xya, imie, nazwisko, co_tam_jeszcze_potrzeba

Tabela artysta_kawalek
Pola
id_artysta_kawalek, id_kawalek, id_artysta

Tabela KAWALEK
Pola
id_kawalek, tytul, opis, nazwa_pliku, katalog, md5
gdzie id_artysta to referencja na pole id_artysta w tabeli artysta

Tabela SAMPLE
Pole id_sample, id_kawalek, tytul, opis, nazwa_pliku, katalog, md5

Offline

 

#3  2011-03-27 10:16:24

  lis6502 - Łowca lamerów

lis6502
Łowca lamerów
Skąd: Stalinogród
Zarejestrowany: 2008-12-04

Re: Zaprojektowanie wydajnej bazy w sqlite

Wow, naprawdę wyczerpująca odpowiedź :). A te pola id_kawalek, id_artysta, co mają zawierać?

gdzie id_artysta to referencja na pole id_artysta w tabeli artysta

Tego nie rozumiem.

Offline

 

#4  2011-03-27 13:09:37

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: Zaprojektowanie wydajnej bazy w sqlite

lis6502 napisał(-a):

A te pola id_kawalek, id_artysta, co mają zawierać?

gdzie id_artysta to referencja na pole id_artysta w tabeli artysta

Tego nie rozumiem.

To mają być klucze klucze obce dla tabel odpowiednio z artystą, kawałkiem.
Jeżeli ID artysty w tabeli ARTYSTA będzie intem z autonumeracją, to w id_artysty też powinno być intem wskazującym na ID wybranego artysty. SPróbuję to jakoś zobrazować:
ARTYSTA:

Kod:

ID | NAZWA | IMIE NAZWISKO
1   | MiXX     | Jan Kowalski
2   | REX      | Staszek Nowak
3   | Pan X    | N N

Tabela KAWALEK

Kod:

ID | NAZWA | SUMA 
1   | abc.xm | krzaki
2   | ja.mp3  | krzaki
3  | on.mp4  |krzaki

Tabela SAMPLE:

Kod:

ID | ID_KAWALKA | ID_ARTYSTY | OPIS
1   |  1                  |  1                | jakis zajefajny kawalek
2   |  2                  |  1                | coś tam innego

Ja tłumaczyć nie umiem ale mam nadzieję że choć trochę się pojaśnił ;]


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#5  2011-04-02 07:42:59

  lis6502 - Łowca lamerów

lis6502
Łowca lamerów
Skąd: Stalinogród
Zarejestrowany: 2008-12-04

Re: Zaprojektowanie wydajnej bazy w sqlite

Spoko, spoko, nie umarłem, temat dla mnie wciąż ważny i aktywny. Ostatnimi czasy było trochę do pohytania, to i na 4um nie miałem czasu, do tego pozostał mi chyba największy problem do przeskoczenia w tym przedsięwzięciu, mianowicie rekursywne listowanie katalogów ze zliczaniem elementów. Oczywiście wszystko ręcznie i w miarę optymalnie ^^.


<HFAUKA>W tym momencie chcę się pochwalić moim nocnym dzieckiem. Otóż, wykonując swoją pracę w godzinach nocnych naszło mnie olśnienie i wymóżdżyłem jak rozwiązać problem wchodzenia do katalogów etc. Do tego w końcu zrozumiałem rekurencję (bo zrozumiałem rekurencję) && naszkryfałem praprzodka tego, co nieznacznie zmodziłem w domu (czyt. zrobiłem tak, żeby działało).

Kod:

#!/bin/bash
IFS=$'\n'
level=0
function op_dir {
for index in `ls`; do
    if [ -f "$index" ]; then
    (( file_desc++ )); echo "Plik $file_desc o nazwie $index"
    elif [ -d "$index" ]; then
    (( dir_desc++ ));echo "Katalog $dir_desc $index";(( level++ )); echo "Wkraczam na level $level";cd "$index";op_dir;(( level-- ));echo "Wracam na $level level"; cd ..
    fi
done
}
op_dir
exit

Jeszcze tylko zrozumiem programowanie obiektowe i będę tak zajebisty, że wygryzę Balmera ;] (wciąż nie spałem po tej nocce ;P) </samo-chwałka>

Wracając do sedna sprawy:
Mam teraz unikalne identyfikatory plików (w BiExi'ejnym przykładzie to chyba id_kawałek) i katalogów. Zamierzam je wykorzystać w poszczególnych tabelach, ale też i w master tabeli (tutaj proszę o pomoc).
Widzę to tak: po 'zeskanowaniu' pliku trafia on do tabeli 'kawałek' w pola odpowiednio id, format, notka etc ORAZ do master tabeli, gdzie zapisywany jest tylko położenie względem root'a kolekcji. Analogicznie, nazwa katalogu dostaje swój identyfikator i trafia do tabeli 'format' i również do master tabeli, tak, że po złożeniu identyfikatów pliku i formatu otrzymuję ścieżkę dostępu względem korzenia kolekcji.
Czyli, przykładowy wpis:

Kod:

'kawalek'
ID                NAZWA
54                tojestto.mod
32                itamto.mod
'format'
ID                NAZWA
3                 protracker
9                 fasttracker
'master'
ID                KATALOG                PLIK
1                9                                54
2                3                                32

Czy to brzmi logicznie z punktu widzenia bazodanowca? Czy da radę jakimś sprytnym zapytaniem na podstawie master tabeli odtworzyć pełną ściezkę?

Wszyscy chcący zobaczyć kolekcję||skorzystać z onej, proszeni są o porzucenie wszelkiej nadzieji wkraczając na mój teren (visit http://93.179.219.175:13031/modland ). Goście ponadto upraszani są o nie robienie szkód :)

Ostatnio edytowany przez lis6502 (2011-04-02 07:51:15)

Offline

 

#6  2011-04-02 08:20:51

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: Zaprojektowanie wydajnej bazy w sqlite

<offtopic> a czy tak się nie prezentuje ładniej: http://nexus.valhalla.org.pl/modland/</offtopic>


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#7  2011-04-02 17:17:20

  lis6502 - Łowca lamerów

lis6502
Łowca lamerów
Skąd: Stalinogród
Zarejestrowany: 2008-12-04

Re: Zaprojektowanie wydajnej bazy w sqlite

Ano prezentuje, tylko ten revproxy zżera Ci łącze :)

Offline

 

#8  2011-04-02 19:59:58

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: Zaprojektowanie wydajnej bazy w sqlite

jakbym się tym przejmował :P
Dobra nie rozmywać :P


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)