Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> system tagow (powiazan) w newsach
andycole
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 14.12.2004

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


Witam.

Szukam jakis materialow na ten temat, ma ktos moze jakies niepotrzebne linki ? (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Z gory dzieki za wskazowki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Denver
post
Post #2





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

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


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





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 7.09.2006
Skąd: Poznań

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


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. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował macbirdie 8.09.2006, 10:04:29
Go to the top of the page
+Quote Post
andycole
post
Post #4





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 14.12.2004

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


z tym Joinem to chyba dobre rozwiazanie z punktu widzenia wydajnosci (zwlaszcza przy kilku tys newsow i kilkuset tagach) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dzieki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
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: 23.12.2025 - 18:41