बस अपनी डेटा इकाइयों को अलग करें कि वे क्या हैं और उनका क्या मतलब है। title
के लिए , tags
और file
ऐसा लगता है कि आपके पास दो इकाइयां हैं:
Picture
----------
ID
Title
File
Tag
----------
ID
Name
यानी title
और file
(आपके मामले में मुझे लगता है कि आप फ़ाइल सिस्टम पर फ़ाइल के पथ के रूप में संग्रहीत कर रहे हैं, जो ठीक है) एक इकाई है, और एक tags
है अपनी अलग इकाई है। चूंकि प्रत्येक Picture
एकाधिक tags
हो सकते हैं s और प्रत्येक tags
एकाधिक Picture
से संबंधित हो सकता है s, यह कई-से-अनेक संबंध है। तो कोई आम तौर पर उन्हें डेटाबेस में जोड़ने के लिए एक सहायक गैर-इकाई तालिका तैयार करेगा:
PictureTagRelationship
----------
PictureID
TagID
इससे आप एक Picture
प्राप्त कर सकते हैं :
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
और उसके टैग:
SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(आप इसे एक ही क्वेरी में दो तरीकों से भी कर सकते हैं, मैंने इसे सादगी के लिए दो में विभाजित किया है। दो प्रश्नों को एक बड़ा सौदा नहीं होना चाहिए, लेकिन यदि आपको अपने डेटाबेस एक्सेस ओवरहेड को अत्यधिक अनुकूलित करने की आवश्यकता है या यदि आप मैं वास्तव में चाहता हूं कि यह एक ही प्रश्न हो तो मुझे यकीन है कि कुछ किया जा सकता है।)
या आप किसी विशिष्ट टैग के लिए सभी चित्र प्राप्त कर सकते हैं:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
इस डिज़ाइन में अन्य बदलाव किए जा सकते हैं और डेटा को देखने और रिपोर्ट करने के कई अन्य तरीके हैं। लेकिन इस सब में एक महत्वपूर्ण बिंदु है:
डेटा संग्रहीत करने के लिए अल्पविराम-सीमांकित सूचियों का उपयोग न करें। प्रत्येक डेटा इकाई को अपनी संरचना में सामान्यीकृत करें और तदनुसार इसे संग्रहीत करें। उस तरह की चीज़ के लिए रिलेशनल डेटाबेस बहुत अच्छे हैं। लेकिन जब भी आप अलग-अलग डेटा तत्वों को एक सीमित स्ट्रिंग के रूप में संग्रहीत करते हैं, तो आप उन तत्वों के अलगाव को खो देते हैं। इससे उस डेटा पर रिपोर्ट करना अधिक कठिन हो जाता है, उसके साथ इंटरैक्ट करना अधिक कठिन हो जाता है, एक बहुत इसे अपडेट करना अधिक कठिन है, और किसी अन्य के लिए कम सहज ज्ञान युक्त है जिसे इसका समर्थन करने की आवश्यकता है।
बस याद रखें कि डेटाबेस में कोई भी एक फ़ील्ड जानकारी का एक टुकड़ा और केवल संग्रहित करना चाहिए जानकारी का एक टुकड़ा। यदि आपको एक ही क्षेत्र में कई सूचनाओं को रटना है तो आप रिलेशनल डेटाबेस का ठीक से उपयोग नहीं कर रहे हैं।