आम तौर पर मैं याकोव एलिस से सहमत होता हूं लेकिन इस विशेष मामले में एक और व्यवहार्य समाधान है:
दो तालिकाओं का उपयोग करें:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
इसके कुछ प्रमुख फायदे हैं:
पहले यह विकास को बहुत सरल बनाता है: डालने और item
आप के अपडेट के लिए तीन-टेबल समाधान में Tag
तालिका को देखने के लिए देखना होगा कि क्या पहले से ही प्रविष्टियां हैं। फिर आपको उन्हें नए के साथ जुड़ना होगा। यह कोई तुच्छ कार्य नहीं है।
फिर यह प्रश्नों को सरल बनाता है (और शायद तेज)। तीन प्रमुख डेटाबेस प्रश्न हैं जो आप करेंगे: सभी Tags
को एक के लिए आउटपुट करें Item
, एक टैग-क्लाउड खींचें और एक टैग शीर्षक के लिए सभी आइटम चुनें।
एक आइटम के लिए सभी टैग:
3-तालिका:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-तालिका:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
टैग क्लाउड:
3-तालिका:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-तालिका:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
एक टैग के लिए आइटम:
3-तालिका:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-तालिका:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
लेकिन कुछ कमियां भी हैं: यह डेटाबेस में अधिक जगह ले सकता है (जो अधिक डिस्क संचालन को धीमा कर सकता है) और यह सामान्यीकृत नहीं है जिससे असंगतता हो सकती है।
आकार का तर्क इतना मजबूत नहीं है क्योंकि टैग की बहुत प्रकृति यह है कि वे आम तौर पर बहुत छोटे होते हैं इसलिए आकार में वृद्धि एक बड़ी नहीं है। कोई यह तर्क दे सकता है कि टैग शीर्षक के लिए क्वेरी एक छोटी तालिका में बहुत तेज है जिसमें प्रत्येक टैग केवल एक बार होता है और यह निश्चित रूप से सच है। लेकिन इसमें शामिल नहीं होने के लिए बचत को ध्यान में रखते हुए और इस तथ्य पर कि आप उन पर एक अच्छा सूचकांक बना सकते हैं, इसके लिए आसानी से क्षतिपूर्ति कर सकते हैं। यह निश्चित रूप से आपके द्वारा उपयोग किए जा रहे डेटाबेस के आकार पर बहुत अधिक निर्भर करता है।
असंगतता की दलील थोड़ी मूट भी है। टैग स्वतंत्र पाठ क्षेत्र हैं और 'बार "के लिए सभी टैग" फू "का नाम बदलने जैसा कोई अपेक्षित संचालन नहीं है।
तो tldr: मैं दो-टेबल समाधान के लिए जाऊंगा। (वास्तव में मैं जा रहा हूं। मुझे यह लेख देखने के लिए मिला कि क्या इसके खिलाफ वैध तर्क हैं।)