Umumnya, untuk hubungan banyak ke banyak ini, ada tiga tabel :
- "
article
" tabel- kunci utama =id
- "
tag
" tabel- kunci utama =id
- berisi data setiap tag :
- nama, misalnya
- Sebuah "
tags_articles
" tabel, yang bertindak sebagai tabel gabungan, dan hanya berisi :id_article
:kunci asing yang menunjuk ke sebuah artikelid_tag
:kunci asing yang menunjuk ke sebuah tag
Dengan cara ini, tidak ada duplikasi data tag apapun :untuk setiap tag, ada satu, dan hanya satu, baris di tag
tabel.
Dan, untuk setiap artikel, Anda dapat memiliki beberapa tag (yaitu beberapa baris di tags_articles
meja); dan, tentu saja, untuk setiap tag, Anda dapat memiliki beberapa artikel.
Mendapatkan daftar tag untuk sebuah artikel, dengan ide ini, adalah masalah kueri tambahan, seperti :
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Mendapatkan tiga artikel "paling mirip" berarti :
- pilih artikel yang memiliki tag seperti artikel pertama
- hanya gunakan yang memiliki jumlah tag identik yang paling penting
Belum diuji, tetapi idenya mungkin seperti ini :
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
Pada dasarnya, Anda :
- pilih id artikel untuk setiap tag yang ada di artikel awal Anda
- karena ada inner join, jika artikel di DB memiliki 2 tag yang cocok dengan
where
klausa, tanpagroup by
klausa, akan ada dua baris untuk artikel itu - tentu saja, Anda tidak ingin memilih kembali artikel yang sudah Anda miliki -- yang berarti artikel tersebut harus dikecualikan.
- karena ada inner join, jika artikel di DB memiliki 2 tag yang cocok dengan
- tetapi, saat Anda menggunakan
group by article.id
, hanya akan ada satu baris per artikel- tetapi Anda dapat menggunakan
count
, untuk mengetahui berapa banyak kesamaan tag yang dimiliki setiap artikel dengan tag awal
- tetapi Anda dapat menggunakan
- lalu, ini hanya masalah pengurutan per jumlah tag, dan hanya mendapatkan tiga baris ketiga.