Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odwoływanie do innych tabel a optymalizacja
Forum PHP.pl > Forum > Bazy danych > MySQL
maciek257
Cześć,

Stworzyłem portal zawierający pewne oferty. Są one przypisane do kategorii oraz posiadają różne parametry (zależne od kategorii, w której się znajdują).
Przypuśćmy, że chcę wywołać listę 100 ofert (bez paginacji). Na tej liście jest podana kategoria oraz parametry dla każdej z ofert.

Pytania brzmią:

1. Czy podczas dodawania ofert do bazy dodawać kategorię w tabeli "Oferty" jako:

a. pole tekstowe z pełną nazwą kategorii
b. id kategorii, która znajduje się w osobnej tabeli "Kategorie" (połączenie kluczem obcym)

Tu dodam, że tabela z kategoriami i tak musi istnieć w innych celach.

2. Czy podczas dodawania ofert do bazy dodawać parametry do:

a. wielu stworzonych kolumn w tabeli "Oferty"
b. osobnej tabeli z parametrami (połączenie kluczem obcym)

Z punktu widzenia zachowania odpowiedniej struktury tabel w obu przypadkach padłaby zapewne odpowiedź "b" natomiast z punktu widzenia optymalizacji dla mnie (laika) odpowiedniejsze byłyby rozwiązania "a" ponieważ podczas wywoływania 100 ofert nie kluczymy 100 razy po 3 tabelach, aby uzyskać odpowiednią finalną tabelę wyników tylko pobieramy rekordy z jednej tabeli.

Zastanawiam się jaki wpływ na prędkość działania zapytań ma stosowanie odwołań do innych tabel.
Czy ma to wpływ marginalny i przy odpaleniu strony ze 100 wynikami przez 1000 osób jednocześnie nie będzie zauważalnej różnicy w przeciążaniu serwera?

Będę wdzięczny z opinie.
Pozdrawiam.
Pyton_000
Generalnie oba B.

Zauważ że np. jak byędziesz wyświetlał ofertę to pewnie będziesz chciał jakiś breadcrumb podać. Co za tym idzie fajnie jest mieć kategorię. Mając nazwę i tak musisz pobierać jej ID, a mając ID już nie.

Druga sprawa jeśli chodzi o normalizację i wydajność.
Jeśli Ci się nie podoba robienie JOIN to możesz zrobić sobie `view` w BD które wyciągnie Ci odpowiednie elementy. Inaczej możesz też napisać raz zapytanie w kodzie i na to samo wyjdzie.

Co do wydajności to tutaj nie ma takiego dużego znaczenia. Silnik BD ma wbudowany cache, więc jeśli będą dobrze dobrane indeksy to oba rodzaje zapytań (z JOIN i bez) będą porównywalne.
Aczkolwiek czasami warto zdenormalizować BD ale tylko w przypadkach gdy obliczenie jakieś wartości zajmuje dość dużo czasu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.