2011-12-05 12 views
5

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

मैं व्यंजनों तालिका में इन गुणों को स्टोर करने का सबसे अच्छा तरीका खोज रहा हूं। मेरे विचार अब तक:

  1. प्रत्येक संपत्ति के लिए एक अलग कॉलम रखें और उन कॉलम पर एक अनुक्रमणिका बनाएं। मेरे पास इन गुणों में से लगभग 20 हो सकते हैं, इसलिए मैं सोच रहा हूं कि एक टेबल पर बूल कॉलम का पूरा समूह बनाने में कोई कमी है या नहीं।
  2. सभी गुणों के लिए बिटमैस्क का उपयोग करें और पूरी चीज़ को एक संख्यात्मक कॉलम में संग्रहीत करें जिसमें बिट्स की उचित संख्या शामिल है। प्रत्येक बिट पर एक अलग इंडेक्स बनाएं ताकि खोज तेज हो जाएंगी।
  3. प्रत्येक टैग के लिए मान के साथ एक ईएनएन बनाएं, फिर उस कॉलम बनाएं जिसमें उस ENUM प्रकार का ARRAY हो। मेरा मानना ​​है कि एक सरणी कॉलम पर कोई भी खंड इंडेक्स का उपयोग कर सकता है, लेकिन इसे कभी नहीं किया है।
  4. एक अलग तालिका बनाएं जिसमें टैग के लिए व्यंजनों का एक से कई मानचित्रण हो। इस टैग में प्रत्येक टैग एक पंक्ति होगी। तालिका में नुस्खा के लिए एक लिंक होगा, और एक ईएनएम मान होगा जिसके लिए उस नुस्खा के लिए टैग "चालू" है। पूछताछ करते समय, मुझे व्यंजनों को फ़िल्टर करने के लिए एक नेस्टेड चयन करना होगा जिसमें इनमें से कम से कम एक टैग नहीं था। मुझे लगता है कि यह करने का यह "सामान्य" तरीका है, लेकिन यह कुछ प्रश्नों को और जटिल बना देता है - अगर मैं 100 व्यंजनों के लिए पूछताछ करना चाहता हूं और उनके सभी टैग भी प्रदर्शित करना चाहता हूं, तो मुझे एक इनर जॉइन का उपयोग करना होगा और एकीकरण करना होगा पंक्तियों, या फ्लाई पर एक नेस्टेड चयन और कुल का उपयोग करें।

लिखना प्रदर्शन किसी समस्या का बहुत बड़ा नहीं है क्योंकि व्यंजनों को बैकएंड प्रक्रिया द्वारा जोड़ा जाता है, और खोज गति महत्वपूर्ण होती है (अंत में कुछ सौ हजार व्यंजन हो सकते हैं)। मुझे संदेह है कि मैं अक्सर नए टैग जोड़ दूंगा, लेकिन मैं चाहता हूं कि बिना किसी सिरदर्द के कम से कम करना संभव हो।

धन्यवाद!

उत्तर

4

मैं आपको सामान्यीकृत सेटअप का उपयोग करने की सलाह दूंगा। डी-सामान्यीकृत संरचना के रूप में जाने से इसे स्थापित करना वह नहीं है जो मैं सलाह दूंगा।

क्या वह जा रहा है के सभी विवरण जानने पर मुझे लगता है कि सबसे अच्छा सेटअप अपने नुस्खा मेज और नई संपत्ति की मेज और एक नया recipe_property तालिका के लिए किया जाएगा के बिना। इससे नुस्खा में 0 या कई गुण होते हैं और आपके डेटा को तेज़ और आसान बनाए रखने और आपके डेटा को क्वेरी करने में आसान बनाते हैं।

उच्च स्तरीय संरचना होगा:

CREATE TABLE recipe(recipe_id); 
CREATE TABLE property(property_id); 
CREATE TABLE recipe_property(recipe_property_id,recipe_id,property_id); 
+0

हाँ निश्चित रूप से एक रास्ता है कि। मैं 'property_id' के बजाय' ENUM' का उपयोग करने और 'प्रॉपर्टी' टेबल' के बारे में भी सोच रहा हूं। हालांकि, आंतरिक रूप से डेटाबेस में यह वही है जो आपके पास है। –

+0

बस सुनिश्चित करें कि आपका अंतिम समाधान आपको कोने में नहीं पेंट करता है। – Kuberchaun

+1

कई विशेषज्ञों से एक ही सलाह प्राप्त करने के बाद मैं सामान्यीकृत मार्ग पर जा रहा हूं। हालांकि, मैंने पोस्टग्रेस के लिए 'hstore' मॉड्यूल को संक्षेप में देखा, जो कि बहुत प्यारा है; हालांकि मैंने इस विशेष स्थिति के लिए इसका उपयोग न करने का फैसला किया। –

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

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