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