Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Tagi dla wpisów - optymalizacja
belwarg
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 26.01.2013

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


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.
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  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."')";


Ten post edytował CuteOne 26.01.2013, 15:20:39
Go to the top of the page
+Quote Post
sabat24
post
Post #3





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

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


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ć.

Ten post edytował sabat24 26.01.2013, 17:19:36
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: 24.08.2025 - 22:25