2012-04-23 16 views
5

मैं SQL डेटाबेस में छवि टैग की एक चर आकार आकार संग्रह करना चाहता हूं और फिर टैग के आधार पर छवियों के लिए डेटाबेस खोज सकता हूं। मैं वर्तमान में डेटाबेस से टैग सूचियों को खींच रहा हूं, और जांच कर रहा हूं कि सरणी में क्वेरी टैग निहित है या नहीं। क्या टैग्स खींचने के बाद क्या मैं उन्हें php में करने के बजाय एसक्यूएल प्रश्नों के रूप में प्रारूपित कर सकता हूं?एक एसक्यूएल स्ट्रिंग सरणी संग्रहित करना, और बाद में पूछताछ

"धूप, समुद्र तट, हथेलियों" -im1

"हथेलियों, बरसात, बादल" -im2

"सर्दी, बर्फ:

सूची फार्म की अल्पविराम द्वारा विभाजित मान के रूप में संग्रहीत किया जाता है , स्नोमैन, लूट "-img

मैं क्वेरी टैग के संघ प्राप्त करने में सक्षम होना चाहते हैं: का एक क्वेरी" समुद्र तट, हथेलियों "लौटना चाहिए IM1 और IM2

धन्यवाद

उत्तर

10

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

छवियाँ टेबल

  • आईडी
  • image_name

टैग टेबल

  • आईडी
  • टी ag_name

Image_Tags टेबल

  • image_id (संदर्भ छवियाँ तालिका प्राथमिक कुंजी)
  • tag_id (संदर्भ टैग तालिका प्राथमिक कुंजी)

इस तरह, आप में सक्षम हो जाएगा इस तरह के प्रश्नों को चलाने के लिए:

SELECT t.tag_name, i.image_name FROM image_tags it 
    INNER JOIN images i on it.image_id = i.id 
    INNER JOIN tags t on it.tag_id = t.id 
WHERE t.tag_name in ('beach', 'palms') 
+1

शानदार उत्तर। यह दूसरी बार है जब मैंने लोगों को डीबी के अंदर मूल्यों की सूचियों का उपयोग करके देखा है और उन्हें खोजना चाहते हैं ... संबंधों के बिना डीबी के संबंध में क्या बात है: पी – DanRedux

+0

धन्यवाद। मुझे वास्तव में यह बहुत अच्छा लेख मिला जो इसे करने के दो अन्य तरीकों का वर्णन करता है। http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi – kmdent

2

@dbaseman ने good answer (+1) प्रदान किया, लेकिन यह हो सकता है कि एक ओवरकिल हो।

छवि तालिका:

    केवल एक चीज आप एक टैग के बारे में जानना चाहते हैं यह मानते हुए कि इसके नाम से, केवल 2 तालिकाओं के साथ मॉडल शायद व्यवहार में बेहतर व्यवहार करेंगे (एक कम शामिल हों और डेटा के बेहतर clustering) है
  • आईडी पी
  • image_name

IMAGE_TAG तालिका:

  • TAG_NAME पी
  • image_id पी, FK -> छवि

IMAGE_TAG के पी में फ़ील्ड के क्रम महत्वपूर्ण है: यदि आप इसे अच्छी तरह से डेटा क्लस्टर जाएगा {tag_name, image_id} के रूप में रखना (अर्थात छवियों एक ही टैग एक साथ) के साथ रखने के लिए, आपको इसकी आवश्यकता बिल्कुल के रूप में क्वेरी करने के लिए:

SELECT DISTINCT image.* 
FROM image JOIN image_tag ON (image.id = image_tag.image_id) 
WHERE image_tag.tag_name IN ('beach', 'palms') 

दूसरी ओर, यदि आप भी एक टैग विवरण, टैग लेखक आदि की आवश्यकता है ..., @ dbaseman के मॉडल है, ठीक है, सिवाय इसके आप Image_Tags पीके (उपरोक्त के समान क्लस्टरिंग कारणों के लिए) में फ़ील्ड के क्रम को फ़्लिप करने पर विचार कर सकते हैं।

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