मुझे विश्वास है कि आपको यह ब्लॉग पोस्ट दिलचस्प लगेगा: टैग: डेटाबेस स्कीमा
समस्या: आप एक डेटाबेस स्कीमा रखना चाहते हैं, जहाँ आप एक बुकमार्क (या ब्लॉग पोस्ट या जो भी चाहें) टैग कर सकते हैं। बाद में, आप बुकमार्क को संघ या टैग के प्रतिच्छेदन के लिए विवश करना चाहते हैं। आप खोज परिणाम से कुछ टैग (कहना: घटाएँ) भी छोड़ना चाहते हैं।
"MySQLicious" समाधान
इस समाधान में, स्कीमा को सिर्फ एक तालिका मिली है, यह अपभ्रंश है। इस प्रकार को "MySQLicious solution" कहा जाता है क्योंकि MySQLicious इस संरचना के साथ एक तालिका में del.icio.us डेटा आयात करता है।
"खोज + webservice + semweb" के लिए अंतर (और) क्वेरी:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
संघ (OR) "खोज | webservice | semweb" के लिए प्रश्न:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
"खोज + webservice-semweb" के लिए माइनस क्वेरी
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
"स्कटल" समाधान
स्कूटल अपने डेटा को दो तालिकाओं में व्यवस्थित करता है। वह तालिका “scCategories” “tag” -table है और “बुकमार्क” -table के लिए एक विदेशी कुंजी मिली है।
"बुकमार्क + webservice + semweb" के लिए अंतर्ग्रहण (और) क्वेरी:
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
HAVING COUNT( b.bId )=3
सबसे पहले, सभी बुकमार्क-टैग संयोजनों को खोजा जाता है, जहां टैग "बुकमार्क", "वेबसेवा" या "सेमीवेब" (सी.कैटोरी आईएन ('बुकमार्क', 'वेबसर्विस', 'सेमवेब')) है, फिर बस वह बुकमार्क जो खोजे गए सभी तीन टैग को ध्यान में रखा गया (HAVING COUNT (b.bId) = 3)।
संघ (OR) "बुकमार्क | वेबसेवा | सेमीवेब" के लिए क्वेरी:
बस बाहर निकलने वाले खंड को छोड़ दें और आप संघ:
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
माइनस (अपवर्जन) क्वेरी "बुकमार्क + वेबसर्विस-सेमीवेब" के लिए, वह है: बुकमार्क और वेबसर्विस और नॉट वीवीईबी।
SELECT b. *
FROM scBookmarks b, scCategories c
WHERE b.bId = c.bId
AND (c.category IN ('bookmark', 'webservice'))
AND b.bId NOT
IN (SELECT b.bId FROM scBookmarks b, scCategories c WHERE b.bId = c.bId AND c.category = 'semweb')
GROUP BY b.bId
HAVING COUNT( b.bId ) =2
HAVING COUNT को छोड़ने से "बुकमार्क | webservice-semweb" के लिए क्वेरी होती है।
"टोक्सी" समाधान
टोक्सी एक तीन-टेबल संरचना के साथ आया था। तालिका "टैगमैप" के माध्यम से बुकमार्क और टैग एन-टू-मी संबंधित हैं। प्रत्येक टैग का उपयोग विभिन्न बुकमार्क्स और इसके विपरीत के साथ किया जा सकता है। इस DB- स्कीमा का उपयोग वर्डप्रेस द्वारा भी किया जाता है। प्रश्न "स्क्रटल" समाधान के समान हैं।
"बुकमार्क + webservice + semweb" के लिए अंतर (और) क्वेरी
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT( b.id )=3
संघ (OR) "बुकमार्क | वेबसेवा | सेमीवेब" के लिए प्रश्न
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
माइनस (अपवर्जन) क्वेरी "बुकमार्क + वेबसर्विस-सेमीवेब" के लिए, वह है: बुकमार्क और वेबसर्विस और नॉट वीवीईबी।
SELECT b. *
FROM bookmark b, tagmap bt, tag t
WHERE b.id = bt.bookmark_id
AND bt.tag_id = t.tag_id
AND (t.name IN ('Programming', 'Algorithms'))
AND b.id NOT IN (SELECT b.id FROM bookmark b, tagmap bt, tag t WHERE b.id = bt.bookmark_id AND bt.tag_id = t.tag_id AND t.name = 'Python')
GROUP BY b.id
HAVING COUNT( b.id ) =2
HAVING COUNT को छोड़ने से "बुकमार्क | webservice-semweb" के लिए क्वेरी होती है।