Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kilka pytan odnosnie MySQL, Klucze/Indexy, Relacje, Typy tabel.
thornag
post
Post #1





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Witam

Obilo mi sie o uszy ze MySQL nie jest prawdziwie relacyjna baza danych, obilo sie takze ze zeby przyspieszyc jej dzialanie trzeba "zakladac" indeksy.

Idea kluczy podstawowych czy obcych chyba jasno wskazuje na relacyjnosc ?

Ale zmierzajac do pytania, chcialbym sie dowiedziec jak najwiecej na temat indeksow, jak to welasciwie dziala jakie sa zasady dodawania kluczy, kiedy powinno sie to stosowac i jak z tego w stu procentach korzystac.

Ten post edytował thornag 6.10.2006, 10:43:48
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Myslq obsluguje wiele typow tabel, m.in.
MyISAM -- domyslna? bez ograniczen referencyjnych (czy jak sie to zwie; nie pilnuje np kluczy obcych), bez transakcji, jest szybka i tyle ma zalet
InnoDB - tranzakcje, integralnosc referencyjna (tego slowa mi braklo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )


Indexy -- sa jak indeks w ksiazce -- nie musisz CALEJ przejrzec zeby znalezc fragment o interesujacym cie zagadnieniu, przegladasz tylko POSORTOWANY indeks. Potem sprawa sie komplikuje, gdy obecnosc indeksow wyszukiwanie danych itd -- nic tylko czytac, sprawdzac itd.
Go to the top of the page
+Quote Post
marcini82
post
Post #3





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Mowiac najprosciej i bez wchodzenia w szczegoly techniczne: indeks zalozony na kolumnie przyspiesza wyszukiwanie danych wzgledem tej kolumny, ale za to spowalnia operacje dodawania i usuwania rekordow.
Indeksy na kluczach glownych i obcych sa w mysql obowiazkowe.
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Index stosuje sie wszedzie tam gdzie mamy pewne kryteria (w sekcji WHERE). Nalezy uwazac z indeksami bo jesli za wiele zalozysz to optymalizator moze nieprawidlowy plan przygotowac. Index ma sens gdzie do okolo 20% rekordow sie powtarza, powyzej tego przedzialu raczej index jest nie zalecany.

Index jest to posortowany zbior wartosci, ktory bezposrednio wskazuje na rekord, przewaznie uzywany jest algorytm btree. Index mozesz zalozyc na jedno pole, na wiele pol (index zlozony) no i oczywiscie na wartosc, czyli masz pole np nazwisko i chcesz uzywac LIKE dla wielkich czy malych liter wiec zakladasz inndex na wartosc LOWER(nazwisko).

Nie wiem jak to jest dokladnie w MySQLu ale sa index zlozony moze zostac uzyty do wyciagniecia danych, po wyrazie SELECT.
Go to the top of the page
+Quote Post
Luciano
post
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 1
Dołączył: 26.07.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Jeszcze dodam od siebie, ze momentem najbardziej spowalniajacym "wyluskiwanie" okreslonych danych z bazy jest przeszukiwanie dysku twardego ktory ma sprzetowe ograniczenia i ponad pewien poziom szybciej sie juz nie da. W zwiazku z tym jak moi przedmowcy nadmienili baza sobie robie "zakladki" wzgledem tego czego chcemy ja przeszukiwac w przyszlosci.

Ten post edytował Luciano 6.10.2006, 09:08:33
Go to the top of the page
+Quote Post
thornag
post
Post #6





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Rzeczywiscie sporo mi to rozjasnilo.

Przyklad, powiedzmy ze mam trzy tabele w bazie danych channel i item i channel_item (RSS).

W pierwszych dwoch zakladam klucze na ID (wiadomo auto_increment), a w drugiej indeksy na obydwa pola ? Czy w ten sposob moge zdefiniowac relacje ktora spowoduje usuniecie rekordow powiazanych po usunieciu np rekordu z tabeli channel ?

Relacja oczywiscie jeden do wieliu (channel - item)
Go to the top of the page
+Quote Post
SongoQ
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@Luciano Ogonie proces strojenia SQL jest to odciaznie operacji I/0 czyli zapis odczyt z hdd.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


thornag: jesli relacja jeden-do-wielu to nie potrzebujesz trzeciej tablicy.

Cytat
Czy w ten sposob moge zdefiniowac relacje ktora spowoduje usuniecie rekordow powiazanych po usunieciu np rekordu z tabeli channel ?

Mozesz: uzyj InnoDB, i FOREIGNKEYow z ON DELETE CASCADE
Go to the top of the page
+Quote Post
thornag
post
Post #9





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Hmm, czyli przy relacji jeden do wielu lepiej umiescic referencje do channel w tabeli item, a w przypadku opisywanym przez Zyxa w jednym z artykulow gdzie mamy utwory i albumy lepiej zrobic 3 poniewaz utwor moze znajdowac sie na wielu albumach ?

Do tego kolejne pytanie. Tym razem z beczki projektowech. Majac tabele uzytkownikow ktorzy moga nalezec do kilku grup, czy dobrym pomyslem jest wydzielanie grup do innej tabeli czy moze zawrzec je w tabeli uzytkownik ?

Jesli rozwiazanie pierwsze to jaka jest najlepsza struktura, ja stosuje user_id - grupa1 - grupa2 pola tinyint/bool kazdy user to nowy rekord. Czy to dobre podejscie ?

Ten post edytował thornag 6.10.2006, 10:31:59
Go to the top of the page
+Quote Post
SongoQ
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


3 Tabele user, grupa, user_grupa. Tabela user_grupa jest tabela ktora laczy 2 pozostale. Wtedy 1 user moze byc w wielu grupach i wielu userow moze byc w tej samej grupie.
Go to the top of the page
+Quote Post
thornag
post
Post #11





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


W rozwiazaniu ktore stosuje teraz jeden user moze nalezec do wielu grup, wystarczy edytowac mu pole grupy i ustawic na 1. W ten sposob mamy mniejsza ilosc rekordow (ja sie nie upieram przy swoim (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ) i tylko dwie tabele. Calosc 'wydaje' sie byc bardziej optymalna. MOglibyscie wytlumaczyc dlaczego lepiej to zaprojektowac na trzech tabelach (biorac pod uwage ze w obydwu rozwiazaniach jest spelnione zalozenie ze user moze byc w wielu grupach).

Drugie, odnosze wrazenie ze tabele na silniku innoDB sa naprawde o wiele bardziej funkcjonalne od MyISAM, jakie sa natomiast ich wady (nie moze byc tak ze sa tylko lepsze bo wyjde na idiote korzystajac caly czas z MyISAM (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )

P.S. Wiem ze moglbym to wszystko znalezc na googlu ale juz mnie topic wciagnal a moze i potomnym sie przyda (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował thornag 6.10.2006, 10:42:31
Go to the top of the page
+Quote Post
SongoQ
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
Drugie, odnosze wrazenie ze tabele na silniku innoDB sa naprawde o wiele bardziej funkcjonalne od MyISAM, jakie sa natomiast ich wady (nie moze byc tak ze sa tylko lepsze bo wyjde na idiote korzystajac caly czas z MyISAM (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )


Minusem jest wydajnosc, wewnetrzne oid czy rowid spowalniaja poniewaz musza byc odwolania do innych tabel (mowa tu o relacji) podonie z transakcjami tez wymagany jest pewien czas. Pewnie by sie jeszcze wiele minusow znalazlo ale jednym z podstawowych jest czas.

Odnosnie 2 tabel jest zlym rozwiazanie jesli chcesz aby jeden user nalezal do wielu grup i jedna grupa do wielu userow. Po co tworzyc wiele userow po co dane powtarzac. Wszystko ma byc czysto i jasno wynikac z polaczen tabel. Jesli wezmiesz wydrukowany schemat bazy to powinienes linia zaznaczyc jak wyciagniesz grupy do usera a w Twoim przypadku tak nie jest. Jesli bedziesz mial wiele userow tych samych to np zmienisz 1 haslo to co we wszystkich modyfikujesz? Podobnie liczenie co bedziesz grupowal dane? To jest zle i tak sie nie robi. Zastanow sie rozrysuj sobie to na kartce i wszystko ladnie Ci wyjdzie.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Cytat
Hmm, czyli przy relacji jeden do wielu lepiej umiescic referencje do channel w tabeli item, a w przypadku opisywanym przez Zyxa w jednym z artykulow gdzie mamy utwory i albumy lepiej zrobic 3 poniewaz utwor moze znajdowac sie na wielu albumach ?

A jeden item RSSa moze nalezec do wielu kanalow? No wlasciwie tez moze. Zalezy jakie masz zalozenia (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


Cytat
Do tego kolejne pytanie. Tym razem z beczki projektowech. Majac tabele uzytkownikow ktorzy moga nalezec do kilku grup, czy dobrym pomyslem jest wydzielanie grup do innej tabeli czy moze zawrzec je w tabeli uzytkownik ?

Jak pisal SongoQ: 3 tabele, bedziesz mial baze znormalizowana (odsylam do googla) -- czyli -- nie bedziesz mial powtarzajacych sie danych, bedziesz mogl dodawac kolejne grupy (edycja schematu bazy aby dodac kolejna to nie jest rozwiazanie), itd.
Go to the top of the page
+Quote Post
thornag
post
Post #14





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Ok dzieki za wyczerpujace wyjasnienia. Reasumujac, przy relacjach jeden do wielu robimy dwie tabele, przy wiele do wielu trzy w tym jedna z powiazaniem. raz jeszcze dzieki

Pozdrawiam.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:20