Ogólnie rzecz biorąc, dla tego rodzaju relacji wiele-do-wielu istnieją trzy tabele:
- „
article
" tabela- klucz podstawowy =identyfikator
- „
tag
" tabela- klucz podstawowy =identyfikator
- zawiera dane każdego tagu :
- na przykład imię i nazwisko
- „
tags_articles
" tabela, która działa jak tabela łączenia i zawiera tylko :id_article
:klucz obcy wskazujący na artykułid_tag
:klucz obcy wskazujący na tag
W ten sposób nie ma duplikacji danych żadnego znacznika :dla każdego znacznika jest jeden i tylko jeden wiersz w tag
tabela.
I dla każdego artykułu możesz mieć kilka tagów (tj. kilka linii w tags_articles
stół); i oczywiście dla każdego tagu możesz mieć kilka artykułów.
Uzyskanie listy tagów dla artykułu, z tym pomysłem, jest kwestią dodatkowego zapytania, takiego jak:
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Pobranie trzech „najbardziej podobnych” artykułów oznaczałoby:
- wybierz artykuły, które mają tagi, które ma pierwszy artykuł
- używaj tylko tych, które mają najważniejszą liczbę identycznych tagów
Nie testowano, ale pomysł może wyglądać tak:
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
Zasadniczo:
- wybierz identyfikatory artykułów dla każdego tagu znajdującego się w początkowym artykule
- ponieważ istnieje sprzężenie wewnętrzne, jeśli artykuł w bazie danych ma 2 znaczniki, które pasują do
where
klauzula, bezgroup by
klauzula, w tym artykule byłyby dwie linijki - Oczywiście nie chcesz ponownie wybierać artykułu, który już miałeś – co oznacza, że należy go wykluczyć.
- ponieważ istnieje sprzężenie wewnętrzne, jeśli artykuł w bazie danych ma 2 znaczniki, które pasują do
- ale, ponieważ używasz
group by article.id
, w artykule będzie tylko jeden wiersz- ale będziesz mógł użyć
count
, aby dowiedzieć się, ile tagów jest wspólnych dla każdego artykułu z początkowym
- ale będziesz mógł użyć
- w takim razie jest to tylko kwestia sortowania według liczby tagów i uzyskania tylko trzech trzecich linii.