Odwoływanie do innych tabel a optymalizacja |
Odwoływanie do innych tabel a optymalizacja |
29.01.2018, 13:54:03
Post
#1
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 5.08.2013 Ostrzeżenie: (0%) |
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. |
|
|
29.01.2018, 14:20:25
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
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. |
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 06:37 |