sql >> Database teknologi >  >> RDS >> Mysql

Hvordan designer man en MySql-tabel til en tagsky?

For denne type mange-til-mange-forhold er der generelt tre tabeller:

  • "article " tabel
    • primær nøgle =id
  • "tag " tabel
    • primær nøgle =id
    • indeholder dataene for hvert tag :
      • navn, for eksempel
  • En "tags_articles " tabel, der fungerer som en jointabel og kun indeholder :
    • id_article :fremmednøgle, der peger på en artikel
    • id_tag :fremmednøgle, der peger på et tag


På denne måde er der ingen duplikering af nogen tags data:for hvert tag er der én og kun én linje i tag tabel.

Og for hver artikel kan du have flere tags (dvs. flere linjer i tags_articles bord); og, selvfølgelig, for hvert tag kan du have flere artikler.

At få en liste over tags til en artikel med denne idé er et spørgsmål om en yderligere forespørgsel, som f.eks.:

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


At få de tre "mest lignende" artikler ville betyde:

  • vælg artikler, der har tags, som den første artikel har
  • brug kun dem, der har det vigtigste antal identiske tags

Ikke testet, men en idé kunne være noget, der ville se sådan ud :

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

Dybest set du :

  • vælg artikel-id'erne for hvert tag, der findes på din oprindelige artikel
    • da der er en indre joinforbindelse, hvis en artikel i DB'en har 2 tags, der matcher where klausul, uden group by klausul, ville der være to linjer for den artikel
    • du ønsker selvfølgelig ikke at genvælge den artikel, du allerede havde - hvilket betyder, at den skal udelukkes.
  • men som du bruger group by article.id , vil der kun være én linje pr. artikel
    • men du vil være i stand til at bruge count , for at finde ud af, hvor mange tags hver artikel har til fælles med den oprindelige
  • så er det kun et spørgsmål om at sortere efter antal tags og kun få de tre tredje linjer.


  1. xampp mysql og phpmyadmin virker ikke

  2. MySQL på slette kaskade. Test eksempel

  3. MYSQL Dump kun visse rækker

  4. Hvordan kan jeg matche de sidste to ord i en sætning i PostgreSQL?