Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

टैगिंग सिस्टम:Toxi समाधान प्रश्न

सबसे पहले "टॉक्सी" एक मानक शब्द नहीं है। हमेशा अपनी शर्तों को परिभाषित करें! या कम से कम प्रासंगिक लिंक प्रदान करें।

और अब सवाल पर ही...

नहीं, आपके पास 3 टेबल होंगे।

आप बहुत हद तक सही रास्ते पर हैं, इस अपवाद के साथ कि आप इनमें से कई चरणों को "मर्ज" करने के लिए SQL की सेट-आधारित प्रकृति का उपयोग कर सकते हैं। उदाहरण के लिए, किसी आइटम 1 को टैग के साथ टैग करना:'tag1', 'tag2' और 'tag3' इस तरह से किया जा सकता है...

INSERT IGNORE INTO tagmap (item_id, tag_id)
SELECT 1, tag_id FROM tags WHERE tag_text IN ('tag1', 'tag2', 'tag3');

IGNORE यह सफल होने की अनुमति देता है, भले ही आइटम इनमें से कुछ टैग से पहले से जुड़ा हो।

यह मानता है कि सभी आवश्यक टैग पहले से ही tags . में हैं . मान लें कि tag.tag_id ऑटो-इन्क्रीमेंट है, आप यह सुनिश्चित करने के लिए कुछ ऐसा कर सकते हैं:

INSERT IGNORE INTO tags (tag_text) VALUES ('tag1'), ('tag2'), ('tag3');

कोई जादू नहीं है। यदि "आइटम किसी विशेष टैग से जुड़ा है" ज्ञान का एक टुकड़ा है जिसे आप रिकॉर्ड करना चाहते हैं, तो यह होगा डेटाबेस में किसी प्रकार का भौतिक प्रतिनिधित्व करने के लिए।

आपका मतलब आइटम को फिर से टैग करना है (टैग को स्वयं संशोधित नहीं करना)?

उन सभी टैग को हटाने के लिए जो सूची में नहीं हैं, कुछ इस तरह करें:

DELETE FROM tagmap
WHERE
    item_id = 1
    AND tag_id NOT IN (
        SELECT tag_id FROM tags
        WHERE tag_text IN ('tag1', 'tag3')
    );

यह 'tag1' और 'tag3' को छोड़कर सभी टैग से आइटम को डिस्कनेक्ट कर देगा। ऊपर दिए गए INSERT को निष्पादित करें और टैग को जोड़ने और हटाने दोनों को "कवर" करने के लिए एक के बाद एक इसे DELETE करें।

आप इन सब के साथ SQL Fiddle में खेल सकते हैं। ।

सही। FK का चाइल्ड एंडपॉइंट रेफ़रेंशियल एक्शन (जैसे ON DELETE CASCADE) को ट्रिगर नहीं करेगा, केवल माता-पिता करेंगे।

BTW, आप इस स्कीमा का उपयोग कर रहे हैं क्योंकि आप tags . में अतिरिक्त फ़ील्ड चाहते हैं (tag_text के पास ), सही? यदि आप ऐसा करते हैं, तो इस अतिरिक्त डेटा को केवल इसलिए नहीं खोना क्योंकि सभी कनेक्शन चले गए हैं वांछित व्यवहार है।

लेकिन अगर आप सिर्फ tag_text चाहते थे , आप एक सरल स्कीमा का उपयोग करेंगे जहां सभी कनेक्शन हटाना टैग को हटाने जैसा ही होगा:

यह केवल SQL को सरल नहीं करेगा, यह बेहतर क्लस्टरिंग भी प्रदान करेगा। ।

पहली नज़र में, "टॉक्सी" ऐसा लग सकता है कि यह अंतरिक्ष की बचत कर रहा है, लेकिन व्यवहार में वास्तव में ऐसा नहीं हो सकता है, क्योंकि इसके लिए अतिरिक्त तालिकाओं और अनुक्रमणिका की आवश्यकता होती है (और टैग छोटे होते हैं)।

ऐसा कुछ करने का निर्णय लेने से पहले उपाय करें। ऊपर उल्लिखित My SQL Fiddle tagmap . में फ़ील्ड के एक बहुत ही जानबूझकर क्रम का उपयोग करता है PK, इसलिए डेटा को इस तरह की गिनती के लिए बहुत अनुकूल तरीके से क्लस्टर किया जाता है (याद रखें:InnoDB टेबल क्लस्टर किए गए हैं ) इससे पहले कि यह एक समस्या बन जाए, आपके पास वास्तव में बड़ी मात्रा में आइटम (या असामान्य रूप से उच्च प्रदर्शन की आवश्यकता) होनी चाहिए।

किसी भी स्थिति में, माप वास्तविक मात्रा में डेटा पर!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ग्रहण में टॉमकैट पर MYSQL के लिए JDBC का उपयोग करते समय classNotFound अपवाद

  2. मैं MySQL ऑप्टिमाइज़र को किसी व्युत्पन्न तालिका पर अनुक्रमणिका का उपयोग करने के लिए कैसे कहूँ?

  3. mysql अवधि और लाने का समय

  4. जन्मदिन स्टोर करने के लिए सबसे अच्छा क्षेत्र कौन सा है?

  5. कॉलम सूची से मेल खाने वाला FULLTEXT इंडेक्स नहीं मिल रहा है (इंडेक्स सेट है)