आम तौर पर, इस तरह के कई-से-अनेक संबंधों के लिए, तीन तालिकाएँ होती हैं:
- "
article
" टेबल- प्राथमिक कुंजी =आईडी
- "
tag
" टेबल- प्राथमिक कुंजी =आईडी
- प्रत्येक टैग का डेटा होता है:
- नाम, उदाहरण के लिए
- ए "
tags_articles
"तालिका, जो एक सम्मिलित तालिका के रूप में कार्य करती है, और इसमें केवल :id_article
:विदेशी कुंजी जो किसी लेख की ओर इशारा करती हैid_tag
:विदेशी कुंजी जो किसी टैग को इंगित करती है
इस तरह, किसी भी टैग के डेटा का दोहराव नहीं होता है:प्रत्येक टैग के लिए, tag
में एक और केवल एक लाइन होती है। टेबल।
और, प्रत्येक लेख के लिए, आपके पास कई टैग हो सकते हैं (अर्थात tags_articles
में कई पंक्तियाँ टेबल); और, ज़ाहिर है, प्रत्येक टैग के लिए, आपके पास कई लेख हो सकते हैं।
इस विचार के साथ किसी लेख के लिए टैग की सूची प्राप्त करना, एक अतिरिक्त प्रश्न का विषय है, जैसे:
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
तीन "सबसे समान" लेख प्राप्त करने का अर्थ होगा:
- उन लेखों का चयन करें जिनमें टैग हैं जो पहले लेख में हैं
- केवल उन्हीं का उपयोग करें जिनमें समान टैग की सबसे महत्वपूर्ण संख्या है
परीक्षण नहीं किया गया है, लेकिन एक विचार कुछ ऐसा हो सकता है जो इस तरह दिखाई देगा:
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
मूल रूप से, आप :
- आपके प्रारंभिक लेख में मौजूद प्रत्येक टैग के लिए लेख आईडी चुनें
- चूंकि एक आंतरिक जुड़ाव है, यदि डीबी में एक लेख में 2 टैग हैं जो
where
से मेल खाते हैं खंड,group by
. के बिना खंड, उस लेख के लिए दो पंक्तियाँ होंगी - बेशक, आप उस लेख का फिर से चयन नहीं करना चाहते जो आपके पास पहले से था -- जिसका अर्थ है कि उसे बाहर करना होगा।
- चूंकि एक आंतरिक जुड़ाव है, यदि डीबी में एक लेख में 2 टैग हैं जो
- लेकिन, जैसा कि आप
group by article.id
का उपयोग करते हैं , प्रति लेख केवल एक पंक्ति होगी- लेकिन आप
count
का उपयोग कर पाएंगे , यह पता लगाने के लिए कि प्रत्येक लेख में शुरुआती एक के साथ कितने टैग समान हैं
- लेकिन आप
- फिर, यह केवल टैग की संख्या के अनुसार क्रमबद्ध करने और केवल तीसरी तीन पंक्तियों को प्राप्त करने की बात है।