2009-09-26 5 views
7

मुझे डेटाबेस में टैग संग्रहीत करने की टोक्सी विधि पर थोड़ी अधिक स्पष्टीकरण चाहिए - एसओ पर कहीं और उल्लिखित। (लेकिन मैं उत्तर नहीं पता)डेटाबेस में टैग संग्रहीत। एक बार या कई बार टैग टैग?

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 

यह शायद एक बेवकूफ सवाल है ... चाहिए प्रत्येक प्रविष्टि, टेबल टैग में, एक अद्वितीय शीर्षक है:

डेटाबेस स्कीमा है। यानी मैं केवल एक बार एक टैग स्टोर करता हूं या इसे हर बार स्टोर करता हूं?

इसे समझने के लिए है, जो दो तालिकाओं के नीचे मैं अंत चाहिए:

TagID  Title 
1   Fish 
2   Cat 
3   Dog 

या

TagID  Title 
1   Fish 
2   Fish 
3   Cat 
4   Fish 
5   Dog 
6   Cat 

पहले तालिका का उपयोग कर रहे हैं, तो टैग प्रवेश करने से पहले मैं पहली बार चलाना होगा और एसक्यूएल स्टेटमेंट यह पता लगाने के लिए कि क्या यह मौजूद है, सही?

किसी भी मदद की सराहना की जाएगी। हाल ही में हैकिंग और इंडेक्सिंग के कारण मेरी अंगुलियों को जला दिया गया था, मूलभूत बातें प्राप्त करना शुरू करना चाहते हैं।

+0

आपके दूसरे समाधान में आपको वास्तव में टैग टेबल की आवश्यकता नहीं है, बस टैग आईडी के बजाय अपनी आइटमटैग तालिका में टैग को सहेजें। हालांकि मैं पहले समाधान का उपयोग करता हूं। – Vertigo

उत्तर

4

मूल बातें यह है कि आपको टैग को स्टोर करने की आवश्यकता है जैसे कि आप पहले मामले में दिख रहे हैं। यह जांचने के लिए अच्छा है कि टैग मौजूद है या नहीं (क्योंकि मौजूदा टैग के लिए दूसरे मामले में आपका डीबी टैग की उन उपस्थितियों के रूप में कई पंक्तियों को वापस करेगा) और टैग द्वारा आइटम पुनर्प्राप्त करने के लिए अच्छा है (आइटम आईडी द्वारा आइटम आईडी का चयन आइटम से चुनने से बेहतर है टैग_आईडी के एक सेट द्वारा आईडी जो समान प्रतिनिधित्व अर्थ है)।

अगर आपने इंडेक्सिंग के कारण अपनी अंगुलियों को जला दिया था - आपको हमेशा यह जांचना चाहिए कि क्वेरी कैसे निष्पादित की जा रही है (mysql के लिए यह EXPLAIN/DESCRIBE SELECT है)।

2

हैं "Fish" और "Fish" एक ही टैग कर रहे हैं, तो आप शायद यह केवल एक बार अपने Tag तालिका में होना चाहिए।

तो, मैं आपके पहले समाधान के साथ जाऊंगा - जो वास्तव में, आपके insert से पहले select करने का तात्पर्य है, यह निर्धारित करने के लिए कि टैग पहले से मौजूद है या नहीं; और, यदि यह मौजूद है, तो ItemTag तालिका में आइटम और टैग के बीच के लिंक के लिए पहले से मौजूद TagID का उपयोग कर रहा है।

दरअसल, यही कारण है कि आइटमटाग मौजूद है: यह एक एसोसिएशन टेबल है, जो वस्तुओं और टैग के बीच संवाद भंडार करती है: प्रत्येक आइटम के लिए, आपके पास कई टैग हो सकते हैं, और, प्रत्येक टैग के लिए, आप कई आइटम नहीं है।

यह भी एक विशिष्ट टैग से जुड़ी वस्तुओं की सूची प्राप्त करने के लिए चीजों को आसान बनाने के लिए चीजों को आसान बनाता है।

1

टैग टैग में केवल टैग होना चाहिए; ItemTag तालिका का पूरा बिंदु आपको एक एन: एम एसोसिएशन (प्रत्येक आइटम वाले एकाधिक टैग, और एकाधिक आइटम से संबंधित प्रत्येक टैग) प्रदान करना है।

यदि आप टैग शीर्षक दोहराएंगे, तो आप टैग तालिका को आइटम आईडी का उपयोग करके तुरंत आईडीआईडी ​​का उपयोग करके संरचना को सरल बना सकते हैं।

+0

-1: टैग दोहराए जाने और टैग टेबल का उपयोग करने से item_ids खोज को वास्तव में संसाधन महंगा बना देगा क्योंकि खोज पूर्णांक की बजाय स्ट्रिंग की तुलना करके स्ट्रिंग की तुलना करके होगी। – Eimantas

+0

@Eimantas: मैंने टैग दोहराने की सिफारिश नहीं की थी। मैं केवल इतना है कि * अगर * टैग दोहराया जाना है, तो आप एक टेबल छोड़ सकते हैं। –

संबंधित मुद्दे