Witam, jestem na etapie tworzenia "całkiem sporego" serwisu internetowego, i chcę to zrobić dobrze. Od kilku dni zatrzymałem się w miejscu i chciałbym prosić doświadczone osoby o radę, wskazówki dotyczące moich wątpliwości. Problem mój polega na tym, że wiem jak mam zrobić to co potrzebuję, ale nie wiem jakim sposobem to wykonać (2 dni czytania artykułów, przeglądania różnych for i teraz mam mętlik w głowie).

Przykładowy schemat prostej bazy danych (w dużym uproszczeniu nawiązuje do części bazy jaką mam faktycznie wykonaną):

tabela "uzytkownicy":
- id (klucz podstawowy)
- login
- pass
- ranga_id (klucz obcy)

tabela "rangi":
- id (klucz podstawowy)
- nazwa

tabela "tematy":

- id (klucz podstawowy)
- autor_id (klucz obcy)
- tytul
- wizyty
- dzial (skrót nazwy działu do którego zalicza się artykuł, np: css, php, mysql)
- gotowy (wartości: 0 lub 1; 0 -> artykuł w trakcie tworzenia, 1 -> artykuł gotowy do wyświetlenia)

tabela "tematy_tekst":
- artykul_id (klucz obcy)
- tresc (w osobnej tabeli, ponieważ po pierwsze nie zawsze używana w połączeniu z resztą danych dotyczących tematów, np: podczas wyświetlania spisu tematów nie wykorzystywana, dane z tej tabeli są pobierane jedynie po wejściu w dany artykuł; po drugie pole treść posiada duży rozmiar, dane przechowywane w formacie utworzonym poprzez edytor WYSIWYG)

1. Różnica między złączeniami typu HASH a NESTED LOOPS (wątpliwość ta pojawiła się po przeczytaniu: http://forum.php.pl/index.php?showtopic=64632)

Jak jest z tym w rzeczywistości?? Czytając inny artykuł na forum jeden z użytkowników napisał także, że przy pobieraniu danych z tabel z więcej niż 100 rekordów różnica między tymi złączeniami jest widoczna. Tyle, że serwis umieszczony będzie na home.pl (hosting), tam nie mam możliwości zmiany "SET enable_nestloop = off;" o czym pisze "prond" w swoim poście. Czyli jak dobrze rozumiem chcąc pobrać dane dotyczące temtów z danej sekcji lepszym rozwiązaniem jest:
  1. SELECT rangi . * , tematy . * , tematy_tekst . * , uzytkownicy . *
  2. FROM rangi INNER JOIN uzytkownicy ON rangi.id = uzytkownicy.ranga_id
  3. INNER JOIN tematy ON uzytkownicy.id = tematy.autor_id
  4. INNER JOIN tematy_tekst ON tematy.id = tematy_tekst.artykul_id AND tematy.dzial = 'css' AND tematy.gotowy = '1'
  5. ORDER BY tematy.id LIMIT 0, 30

niż:
  1. SELECT rangi . * , tematy . * , tematy_tekst . * , uzytkownicy . *
  2. FROM rangi, tematy, uzytkownicy, tematy_tekst
  3. WHERE rangi.id = uzytkownicy.ranga_id AND tematy.id = tematy_tekst.artykul_id AND uzytkownicy.id = tematy.autor_id AND tematy.dzial = 'css' AND tematy.gotowy = '1'
  4. ORDER BY tematy.id LIMIT 0, 30

Z drugiej strony nie wiem jak sprawdzić ustawienie opcji "enable_nestloop", czy wartość "on" jest wartością domyślnąquestionmark.gif Jak to sprawdzić?? (prawdopodobnie na home.pl nie będę miał możliwości sprawdzenia ani zmiany:/) Który rodzaj złączenia wykorzystać w swoich funkcjach??

2. Czy stosowanie widoków ma sens??
Miałem zamiar korzystać z nich, np:
- widok(i) zawierający dane artykułów (tematów) z danego działu (np: css) gotowych do publikacji (1)
- widok zawierające dane nieukończonych artykułów(0)

Sądziłem, że to usprawni, przyśpieszy pobieranie danych z bazy. Lecz czy to prawda?? (tu znowu nawiązanie do przytoczonego wyżej postu). Czy może takie wykorzystanie widoków jest marnowaniem ich możliwości?? Jeśli tak to proszę o podpowiedzi apropo sytuacji w odniesieniu do tego przykładu bazy, w których wykorzystanie widoków byłoby uzasadnione i wskazane??

3. Czy typ złączenia wykorzystanego przy tworzeniu widoku ma wpływ na wydajność podczas korzystania z niego?? (kolejne pytanie nawiązujące do przytoczonego postu);
czyli, czy np:
  1. CREATE VIEW v1_css AS SELECT rangi.nazwa, tematy. * , tematy_tekst.tresc, uzytkownicy.login FROM rangi INNER JOIN uzytkownicy ON rangi.id = uzytkownicy.ranga_id
  2. INNER JOIN tematy ON uzytkownicy.id = tematy.autor_id
  3. INNER JOIN tematy_tekst ON tematy.id = tematy_tekst.artykul_id AND tematy.dzial = 'css' AND tematy.gotowy = '1'
  4. ORDER BY tematy.id LIMIT 0, 30

różni się od:
  1. CREATE VIEW v2_css AS SELECT rangi.nazwa, tematy. * , tematy_tekst.tresc, uzytkownicy.login FROM rangi, tematy, uzytkownicy, tematy_tekst
  2. WHERE rangi.id = uzytkownicy.ranga_id AND tematy.id = tematy_tekst.artykul_id AND uzytkownicy.id = tematy.autor_id AND tematy.dzial = 'css' AND tematy.gotowy = '1'
  3. ORDER BY tematy.id

Czy metoda tworzenia widoku wpływa na wydajność korzystania z niego?? Jeśli tak to czy ma to związek z wspomnianą wcześniej zmienną "enable_nestloop"??

Wiem że trochu to przydługawe, ale chciałem jak najdokładniej wyjaśnić moje wątpliwości. Proszę o Wasze rady i pomoc w wybraniu najlepszych metod.