Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tag cloud - pomysł na tabelki.
Forum PHP.pl > Forum > Bazy danych > MySQL
exseerius
Witam,

Moje pytanie brzmi, jak zrobić taki fajny Tag Cloud jak na wiekszości stron webowo dwu-zerowych!
Nie wiem jak zorganizować tabele, żeby szybko tego szukać.

Założenia sa takie:
- dwie tabele: newsy:[id][tytul][tresc][tagi] i tags:[tags]/[counter]/
- przy wpisywaniu newsa/arta/dodawaniu plików do downloadu bedzie input type:text gdzie bedą dodawane tagi oddzielone spacją.
- przy dodawaniu wpisu do bazy najpierw bedą sprawdzane tagi (rozbite explodem) i sprawdzane, czy nie ma ich w tabeli "tags"
- jeżeli danego tagu nie bedzie to zostanie dodany
- możliwość wyświetlenia wystkiego co nawiązuje do danego tagu (LIKE %TAG%)

No i dobra, wszystko ładnie pieknie do tego momentu problemu nie ma, tylko zastanawiam się jak to rozwiązać. czy zbudować tabele "tags": [tag][couner], czy wystarczy samo "tags":[tag]. Przy założeniu pierwszej opcji przy dodawaniu newsa, bedą sprawdzane tagi jeżeli istnieje to oczywiście $tags['counter']+1; przy kasowaniu -1 i wyświetlanie tagowej chmurki nie bedzie trudne. Druga opcja wydaje mi sie jednak bardziej elastyczna i mniej podatna na błędy (np. 2 osoby w tym samym czasie skasują dwa różne pliki które miały ten sam tag to mysql może się wysypać), tylko niestety nie wiem jak ten drugi sposób ogarnąć, czy brać pokolei while'm wszystkie tagi i zliczać je z drugiej tabeli (patrz. ostatni punkt założeń) - po czym wywali ilość rzeczy w tagu. Przy kilku takich wpisach to nie ma problemu, ale załóżmy, że w db zdążyło zgromadzić się 100.000 tagów i 50.000 newsów, które korzystają z nich, njak to ma się do wydajności MySQL'a?

No chyba, że zna ktoś jeszcze inny sposób na robienie listy tagów.
k1ller
Przegladnij to http://prism-perfect.net/archive/php-tag-cloud-tutorial/
exseerius
OK, przeczytałem, przeanalizowałem i przykład zakłąda posiadanie jednego słowa kluczowego w kolumnie tags, a mi chodzi o coś takiego, że w tags mam kilka słów kluczowych oddzielonych spacją i jak teraz je posortować?
nrm
tags:
------
tag_id|tag_name

tags_rel:
----------
tag_id|item_id
exseerius
Takie coś wymyśliłem, ogólnie działa i jeszcze przez jakiś czas podziała - do momentu póki w db faktycznie nie będzie za dużo wpisów, bo arraye to lubią się mulić tongue.gif

Opiera sie na dwóch tabelach, jedna z danymi, gdzie konieczna jest kolumna [tags] i druga tabela tags, gdzie jest tylko jedna kolumna [tag], nie jest konieczny [id] bo tag przecie sam w sobie jest id ;P

Jak działa? Otóż wrzucamy wsio do arraya, są dwa, jeden to klucze drugi wartości, później łączymy tablice i sortujemy wg największych wielkości, ażeby wybrać określoną ilość najpopularniejszych tagów. pobieram info o tym ile jest max, a ile min dla tych tagów, na podstawie tego dobierana będzie wielkość tagów. I na koniec sortowanie wg kluczy (nazwy tagów), żeby ładnie w kolejności alfabetycznej wywalić na stronie... Może być, czy dzikość się wkradła?


  1. <?php
  2. $tg = array();
  3. $pt = array();
  4.  
  5. $query = mysql_query ('SELECT * FROM `tags` ORDER BY `tag` DESC');
  6.  
  7. while($tag = mysql_fetch_array($query)) {
  8. $cnt = mysql_num_rows(mysql_query ('SELECT * FROM `dane` WHERE `tags` LIKE "%'.$tag['tag'].'%"'));
  9. array_push($tg,$tag['tag']);
  10. array_push($pt,$cnt);
  11. }
  12.  
  13. $tag_arr = array_combine($tg,$pt);
  14. arsort($tag_arr);
  15.  
  16. $tag_out = array_slice($tag_arr,0,$liczba_tagow);
  17. ksort($tag_out);
  18.  
  19. $max = max($tag_out);
  20. $min = min($tag_out);
  21. ?>


--- EDIT ---

Troche krócej, nie wiem czemu tak dookoła i po schodach pod górę krązyłem tongue.gif

  1. <?php
  2. $query = mysql_query ('SELECT * FROM `tags` ORDER BY `tag` DESC');
  3.  
  4. while($tag = mysql_fetch_array($query)) {
  5. $cnt = mysql_num_rows(mysql_query ('SELECT * FROM `dane` WHERE `tags` LIKE "%'.$tag['tag'].'%"'));
  6. $tag_arr[$tag['tag']] = $cnt;
  7. }
  8.  
  9. arsort($tag_arr);
  10.  
  11. $tag_out = array_slice($tag_arr,0,$liczba_tagow);
  12. ksort($tag_out);
  13.  
  14. $max = max($tag_out);
  15. $min = min($tag_out);
  16. ?>
nrm
dramatyczne rozwiązanie, ile ty chcesz tych sqli namnożyć? :/
exseerius
to czekam na inne rozwiązania... aczkolwiek jeszcze się zastanawaim nad drugą opcją... tongue.gif
nrm
inne rozwiązania zostały podane wyżej.

twoje "rozwiązanie" robi conajmniej tyle sqli ile wyciaganych tagów. biorąc pod uwagę to, że np.moja kilkumiesieczna baza ma już blisko 1000 słów (i kilka tysiecy relacji) to twój kod robił by te tysiace sqli na reload ;D
exseerius
normanos przekonałeś mnie... Robie jednak na tabeli [tag][ilość_tagów_na_stronie]... Dzięki za uświadomienie, że nie ma sensu ciągłe sprawdzanie wszystkich rekordów, jeżeli np treść ulega zmianie jedynie raz na jakiś czas...
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.