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 artikelid_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, udengroup 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.
- da der er en indre joinforbindelse, hvis en artikel i DB'en har 2 tags, der matcher
- 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
- men du vil være i stand til at bruge
- så er det kun et spørgsmål om at sortere efter antal tags og kun få de tre tredje linjer.