Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Tagi dla wpisów - optymalizacja
Forum PHP.pl > Forum > Przedszkole
belwarg
Witam!
Potrzebuję trochę informacji jak najlepiej zorganizować system tagów dla wpisów, żeby działało to w miarę optymalnie.
Uproszczona struktura bazy:
tabela wpis (id_wpisu, nazwa_wpisu)
tabela tagi (id_tagu, nazwa_tagu)
tabela wpisy_tagi (id_wpisu, id_tagu)

Za pomocą formularza odbieram dane, sprawdzam i jeśli wszystko jest ok to wrzucam do bazy. Głównym problemem są tagi - jak to zrobić żeby nie tworzyć niepotrzebnych zapytań.
Tagi są wpisywane jako tekst oddzielony przecinkiem np "tag1, długi tag2, tag3, tag4" etc. Pobieram dane, czyszczę z różnych śmieci, robię explode po "," i mam tagi w tabeli.
Teraz zaczynają się schody. Dla każdego taga robię trim i sprawdzam czy jest w tabeli "tagi". Zależnie od wyniku:
- jeśli jest to pobieramy id_tagu
- jeśli nie ma to dodajemy do tabeli i pobieramy nowoutworzone id_tagu
Do tabeli "wpisy_tagi" wrzucamy id_wpisu, id_tagu

Jak to najoptymalniej rozwiązać? Pobrać całą zawartość tabeli "tagi", czy też może dla każdego tagu tworzyć osobne zapytanie sprawdzające? Orientacyjnie każdy wpis będzie miał do kilkunastu tagów, wpisów może być sporo więc sama tabela "tagi" po pewnym czasie urośnie.
CuteOne
  1. function trimArray($v) { return trim($v); }
  2.  
  3. $tagi = "tag, tag2, tag3";
  4. $tagi_exp = explode(',', $tagi); //rozbijamy string
  5. $tagi_sql = implode("','", array_map('trimArray', $tagi_exp)); // scalamy tablicę
  6.  
  7. $sql = "SELECT id_tag FROM tagi WHERE tagi_nazwa IN ('".$tagi_sql."')";
sabat24
Cytat
- jeśli jest to pobieramy id_tagu
- jeśli nie ma to dodajemy do tabeli i pobieramy nowoutworzone id_tagu

Obie te rzeczy możesz też załatwić INSERT INTO ... ON DUPLICATE KEY UPDATE

W przypadku, gdy w bazie danych duplikaty stanowią mniej niż 70% danych, to zapytanie zaprezentowane tutaj będzie szybsze od powyższego z SELECTEM. Jeśli po pewnym czasie tagi będą się już mocno powtarzać, lepiej zastosuj SELECT w celu filtracji i później dopiero INSERT na danych nieistniejących. Wyliczenia opieram na własnych testach, więc przy różnych danych mogą się różnić.
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.