sql >> Databasteknik >  >> RDS >> Mysql

Hur designar man en MySql-tabell för ett taggmoln?

I allmänhet, för den här typen av många-till-många-relationer, finns det tre tabeller:

  • "article " tabell
    • primär nyckel =id
  • tag " tabell
    • primär nyckel =id
    • innehåller data för varje tagg :
      • namn, till exempel
  • En "tags_articles " tabell, som fungerar som en sammanfogningstabell och innehåller endast :
    • id_article :främmande nyckel som pekar på en artikel
    • id_tag :främmande nyckel som pekar på en tagg


På detta sätt finns det ingen dubblering av någon taggs data:för varje tagg finns det en och bara en rad i tag bord.

Och för varje artikel kan du ha flera taggar (dvs. flera rader i tags_articles tabell); och, naturligtvis, för varje tagg kan du ha flera artiklar.

Att få en lista med taggar för en artikel, med denna idé, är en fråga om en ytterligare fråga, som :

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


Att få de tre "mest lika" artiklarna skulle innebära:

  • välj artiklar som har taggar som den första artikeln har
  • använd bara de som har det viktigaste antalet identiska taggar

Inte testat, men en idé kan vara något som skulle se ut så här :

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

I grund och botten, du :

  • välj artikel-id:n för varje tagg som finns i din första artikel
    • eftersom det finns en inre koppling, om en artikel i DB har 2 taggar som matchar where sats, utan group by klausul, skulle det finnas två rader för den artikeln
    • naturligtvis vill du inte välja om artikeln du redan hade -- vilket betyder att den måste uteslutas.
  • men, eftersom du använder group by article.id , kommer det bara att finnas en rad per artikel
    • men du kommer att kunna använda count , för att ta reda på hur många taggar varje artikel har gemensamt med den första
  • då är det bara en fråga om att sortera efter antal taggar och bara få de tre tredje raderna.


  1. mysqldump-tabell utan att dumpa primärnyckeln

  2. Ta bort miljontals rader i MySQL

  3. Hanteringsdatum i SQL Server

  4. MySQL Tutorial – En nybörjarguide för att lära dig MySQL