Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: system tagow (powiazan) w newsach
Forum PHP.pl > Forum > PHP
andycole
Witam.

Szukam jakis materialow na ten temat, ma ktos moze jakies niepotrzebne linki ? smile.gif

Wiem tyle, ze musza byc 2 tabele:

1st (powiazania, np news 1st i wypisanie jego tagow, nastepny rekord, news 2nd i wypisanie jego tagow itp)

id_news | tagi

2nd (lista zdefiniowanych tagow)

tagi

Jednak czy takie rozwiazanie jest optymalne? Watpie tongue.gif

Z gory dzieki za wskazowki smile.gif
Denver
Pierwsze rozwiązanie, które przychodzi mi do głowy, to skorzystanie z jednej tabeli w bazie:
Kod
+--------------------------+
+ news_id | tagi           +
+--------------------------+
+ 1       | ,html,css,php, +
+ 2       | ,xml,rss,      +
+--------------------------+


Parę słów nt. rozwiązania problemu tagów: w bazie trzymałbym listę tagów przypisanych konkretnej wiadomości oddzielonych przecinkami. Oczywiste jest, że tag nie może zawierać przecinka w swojej nazwie, bo rozwiązanie szlak trafi.

Wyszukując wszystkie wiadomości np. o tagu "css", wystarczyłoby jedno zapytanie SQL:
  1. SELECT news_id FROM newsy WHERE tagi LIKE '%,css,%'

Ważne jest, aby w kolumnie "tagi" lista zaczynała się i kończyła przecinkiem, gdyż inaczej pierwszy i ostatni tag z listy nie byłby przez powyższe zapytanie znajdowany.

Co do wydajności powyższego rozwiązania: na pewno zapytanie SELECT ... LIKE nie jest najszybsze, lecz dla małych witryn o niewielkim obciążeniu bazy powinno wystarczyć.
macbirdie
Może to nieco oczywiste, ale chyba o wieele szybsze, a prawdopodobnie tak samo przestrzeniożerne rozwiązanie, to trzy tabele:
1. newsy
2. tagi
3. relacja wiele-do-wielu newsów i tagów

czyli
newsy: news_id, tytuł, inne
tagi: tag_id, nazwa taga, inne?
newsy_tagi: news_id, tag_id (klucz główny z obu kolumn)

Potem tylko prosty join
  1. SELECT news_id FROM newsy, tagi, newsy_tagi WHERE newsy_tagi.news_id=newsy.news_id AND newsy_tagi=tag_id=tagi.tag_id AND tagi.tag_nazwa="css"


Engine bazy przy LIKE musi skanować kolumnę tagi wszystkich rekordów newsów, jakie są w tabeli, zatem wykonywać masę niepotrzebnej roboty. W tym rozwiązaniu, w najgorszym wypadku, będzie w prosty sposób sprawdzał wszystkie rekordy tagów, a tych pewnie będzie mniej i porównania prostsze. smile.gif
andycole
z tym Joinem to chyba dobre rozwiazanie z punktu widzenia wydajnosci (zwlaszcza przy kilku tys newsow i kilkuset tagach) smile.gif dzieki smile.gif
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.