sql >> Databáze >  >> RDS >> Mysql

Jak navrhnout MySql tabulku pro Tag Cloud?

Obecně pro tento druh vztahu many-to-many existují tři tabulky:

  • article " tabulka
    • primární klíč =id
  • Značka tag " tabulka
    • primární klíč =id
    • obsahuje data každé značky :
      • například jméno
  • tags_articles " tabulka, která funguje jako spojovací tabulka a obsahuje pouze :
    • id_article :cizí klíč, který ukazuje na článek
    • id_tag :cizí klíč, který ukazuje na značku


Tímto způsobem nedochází k duplicitě dat žádné značky:pro každou značku je ve značce tag jeden a pouze jeden řádek. tabulka.

A pro každý článek můžete mít několik značek (tj. několik řádků v tags_articles stůl); a samozřejmě pro každý tag můžete mít několik článků.

Získání seznamu značek pro článek s touto myšlenkou je otázkou dodatečného dotazu, například:

select tag.*
from tag
    inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


Získání tří „nejpodobnějších“ článků by znamenalo:

  • vyberte články se štítky, které má první článek
  • používejte pouze ty, které mají nejdůležitější počet identických značek

Netestováno, ale nápad by mohl vypadat takto:

select article.id, count(*) as nb_identical_tags
from article
    inner join tags_articles on tags_articles.id_article = article.id
    inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
      and article.id <> 123
group by article.id
order by count(*) desc
limit 3

V podstatě vy:

  • vyberte ID článků pro každou značku, která se nachází v prvním článku
    • protože existuje vnitřní spojení, pokud má článek v databázi 2 značky, které odpovídají where klauzule bez group by klauzule, byly by pro tento článek dva řádky
    • samozřejmě nechcete znovu vybrat článek, který jste již měli – což znamená, že musí být vyloučen.
  • ale když používáte group by article.id , na článek bude pouze jeden řádek
    • ale budete moci použít count , abyste zjistili, kolik tagů má každý článek společných s úvodním
  • Pak je to jen otázka řazení podle počtu značek a získání pouze třetích tří řádků.


  1. Získejte nejběžnější hodnotu pro každou hodnotu jiného sloupce v SQL

  2. Je vaše databáze zabezpečená? Zamyslete se znovu

  3. Oracle PL/SQL získat IP server v4?

  4. Jaký je význam 1/1/1753 v SQL Server?