किसी डेटाबेस में टैग स्टोर करने का सबसे कुशल तरीका क्या है?


138

मैं अपनी वेबसाइट पर एक स्टैगओवरफ़्लो उपयोग के समान एक टैगिंग प्रणाली लागू कर रहा हूं, मेरा सवाल है - टैग को स्टोर करने का सबसे प्रभावी तरीका क्या है ताकि उन्हें खोजा और फ़िल्टर किया जा सके?

मेरा विचार यह है:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

क्या यह बहुत धीमी है? क्या कोई बेहतर तरीका है?


2
पहले पूछा गया: stackoverflow.com/questions/20856/…
DrBloodmoney

1
2016 के अनुसार,
चार्ल्स एल।

जवाबों:


189

एक आइटम में कई टैग होने वाले हैं। और एक टैग कई वस्तुओं का होगा। इसका मतलब यह है कि आपको कई-कई बाधाओं को दूर करने के लिए संभवतः एक मध्यस्थ तालिका की आवश्यकता होगी।

कुछ इस तरह:

तालिका: आइटम
कॉलम: Item_ID, Item_Title, सामग्री

तालिका: टैग
कॉलम: Tag_ID, Tag_Title

तालिका: Item_Tags
कॉलम: Item_ID, Tag_ID

यह हो सकता है कि आपका वेब ऐप बेहद लोकप्रिय हो और सड़क को अपवित्र करने की आवश्यकता हो, लेकिन यह पानी को बहुत जल्दी मैला कर रहा है।



अगर टैगग्राफ़ जैसी कोई चीज़ है तो उसे कैसे संभालना है जैसे टैग को श्रेणियों में वर्गीकृत किया जाता है जैसे: प्रोग्रामिंग भाषाएँ: c #, vb, मोती। OS: windows7, dos, linux आदि
थंडर

4
@ थंडर: यह मानते हुए कि एक टैग केवल एक श्रेणी का हो सकता है, मैं एक टैग श्रेणी तालिका बनाऊंगा जिसमें श्रेणी_ और श्रेणी_नाम शामिल हैं। वहां से, मैं टैग तालिका में एक category_id फ़ील्ड को जोड़ूंगा और उस पर एक प्रदर्शन करूंगा।
साइमन स्कार्फ

114

डेटाबेस स्कीमा को टैग करने के बारे में आपको फिलिप केलर के ब्लॉग पोस्ट को पढ़ना चाहिए। वह कुछ प्रयास करता है और अपने परिणामों की रिपोर्ट करता है, दोनों सामान्य प्रश्नों के निर्माण में आसानी के साथ , और प्रदर्शन के संदर्भ में । टैग की संख्या, टैग की गई वस्तुओं की संख्या और प्रति आइटम टैग की संख्या सभी कारक थे। पोस्ट 2005 से हैं; तब से मैं किसी भी अपडेट के बारे में नहीं जानता।


19
मुझे लगता है कि यह सबसे अच्छा जवाब है। यह अधिकांश अन्य उत्तरों की तरह दमन के बजाय वास्तविक परीक्षणों और शोध पर आधारित है।
क्रिस्टियन व्राबी

4
जवाब में लिंक काम नहीं कर रहा है। Vtidter.blogspot.be/2014/02/database-schema-for-tags.html
Christophe Herreman

8

वास्तव में मुझे विश्वास है कि टैग तालिका को डी-नॉर्मलाइज़ करना, स्केल के आधार पर एक बेहतर तरीका हो सकता है।

इस तरह, टैग तालिका में केवल टैगिड, आइटमिड, टैग्नैम है।

आपको डुप्लिकेट टैग्नैम मिलेंगे, लेकिन यह विशिष्ट वस्तुओं के लिए टैग्स को जोड़ना / हटाना / संपादित करना अधिक सरल बनाता है। आपको एक नया टैग बनाने की ज़रूरत नहीं है, पुराने के आवंटन को हटा दें और एक नए को फिर से आवंटित करें, आप केवल tagname संपादित करें।

टैग की सूची प्रदर्शित करने के लिए, आप बस DISTINCT या GROUP BY का उपयोग करते हैं, और निश्चित रूप से आप गिन सकते हैं कि टैग कितनी बार आसानी से उपयोग किया जाता है।


4

यदि आप किसी गैर-मानक सामान का उपयोग करने में कोई आपत्ति नहीं करते हैं, तो संस्करण 9.4 पर पोस्टग्रैज़ करें और ऊपर JSON टेक्स्ट ऐरे प्रकार के रिकॉर्ड को संग्रहीत करने का एक विकल्प है।

आपका स्कीमा होगा:

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]

अधिक जानकारी के लिए, जोश बर्कस की यह उत्कृष्ट पोस्ट देखें: http ://www.dat डेटाबेसoup.com/2015/01/tag-all:thod.html

प्रदर्शन के लिए पूरी तरह से तुलना में अधिक विभिन्न विकल्प हैं और ऊपर सुझाया गया सबसे अच्छा समग्र है।


2

मैं टैग्स स्टोर करने के लिए मध्यस्थ की तीसरी तालिका का उपयोग करने का सुझाव देता हूं <=> आइटम एसोसिएशन, क्योंकि टैग और आइटम के बीच हमारे कई-से-कई संबंध हैं, अर्थात एक आइटम कई टैग के साथ जुड़ा हो सकता है और एक टैग कई वस्तुओं के साथ जुड़ा हो सकता है। एचटीएच, वाल्व।


1

आप वास्तव में एक प्रश्न में प्रदान किए गए डेटा के आधार पर धीमेपन के बारे में बात नहीं कर सकते। और मुझे नहीं लगता कि आपको विकास के इस स्तर पर प्रदर्शन के बारे में बहुत अधिक चिंता करनी चाहिए। इसे समयपूर्व अनुकूलन कहा जाता है

हालाँकि, मेरा सुझाव है कि आप टैग तालिका में Tag_ID कॉलम शामिल करेंगे। यह आमतौर पर एक अच्छा अभ्यास है कि हर टेबल में एक आईडी कॉलम होता है।


1

यदि अंतरिक्ष एक मुद्दा बनने जा रहा है, तो टैग के लिए पाठ को संग्रहीत करने के लिए एक तीसरा तालिका टैग (Tag_Id, शीर्षक) रखें और फिर अपनी टैग तालिका को बदलकर (Tag_Id, Item_Id) करें। उन दो मूल्यों को एक अद्वितीय समग्र प्राथमिक कुंजी भी प्रदान करनी चाहिए।


0

आइटम में "आईडी" फ़ील्ड होना चाहिए, और टैग में "आईडी" फ़ील्ड (प्राथमिक कुंजी, क्लस्टर) होना चाहिए।

फिर ItemID / TagID की एक मध्यवर्ती तालिका बनाएं और वहां पर " परफेक्ट इंडेक्स " डालें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.