मुझे जो करना पसंद है, उसमें कई टेबल हैं जो कच्चे डेटा का प्रतिनिधित्व करते हैं, इसलिए इस मामले में आपके पास होगा
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
यह लिखने के समय के लिए तेजी से काम करता है, और सब कुछ सामान्यीकृत रखता है, लेकिन आप यह भी नोट कर सकते हैं कि प्रत्येक टैग के लिए, आपको हर उस अतिरिक्त टैग के लिए दो बार जुड़ना होगा, जिसे आप चाहते हैं, इसलिए यह धीमा पढ़ने के लिए है।
पढ़ने में सुधार करने के लिए एक समाधान एक संग्रहीत कार्यविधि स्थापित करके कमांड पर एक कैशिंग तालिका बनाना है जो अनिवार्य रूप से एक नई तालिका बनाता है जो एक चपटा प्रारूप में डेटा का प्रतिनिधित्व करता है ...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
तब आप विचार कर सकते हैं कि कितनी बार टैग की गई आइटम तालिका को अद्यतित रखने की आवश्यकता है, यदि यह प्रत्येक प्रविष्टि पर है, तो संग्रहित प्रक्रिया को कर्सर सम्मिलित घटना में कॉल करें। यदि यह एक घंटे का काम है, तो इसे चलाने के लिए एक घंटे का काम निर्धारित करें।
अब डेटा पुनर्प्राप्ति में वास्तव में चतुर होने के लिए, आप टैग से डेटा प्राप्त करने के लिए एक संग्रहीत प्रक्रिया बनाना चाहेंगे। बड़े पैमाने पर केस स्टेटमेंट में नेस्टेड प्रश्नों का उपयोग करने के बजाय, आप एकल पैरामीटर में पास होना चाहते हैं जिसमें उन टैगों की एक सूची होती है जिन्हें आप डेटाबेस से चुनना चाहते हैं, और आइटम का रिकॉर्ड सेट लौटाते हैं। यह बिटकॉइन ऑपरेटरों का उपयोग करते हुए, द्विआधारी प्रारूप में सबसे अच्छा होगा।
द्विआधारी प्रारूप में, यह समझाना आसान है। मान लें कि किसी आइटम को असाइन किए जाने वाले चार टैग हैं, बाइनरी में हम उस का प्रतिनिधित्व कर सकते हैं
0000
यदि सभी चार टैग किसी ऑब्जेक्ट को सौंपे जाते हैं, तो ऑब्जेक्ट इस तरह दिखेगा ...
1111
अगर सिर्फ पहले दो ...
1100
फिर यह आपके इच्छित कॉलम में 1s और शून्य के साथ द्विआधारी मूल्यों को खोजने का मामला है। SQL सर्वर के Bitwise ऑपरेटरों का उपयोग करके, आप यह देख सकते हैं कि पहले कॉलम में बहुत ही सरल प्रश्नों का उपयोग करके 1 है।
अधिक जानने के लिए इस लिंक को देखें ।