2009-06-07 10 views
5

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

उन क्षेत्रों को सभी संपर्क रिकॉर्ड के लिए प्रवेश के लिए उपलब्ध होना चाहिए।

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

+1

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

+0

आप 100% सही हैं। मैं उस आवश्यकता के साथ अटक गया हूं :( – Alex

+0

मैंने इसे कई अनुप्रयोगों में पूरा किया है, जब आप इस प्रकार की आवश्यकता को लागू करते हैं, तो यह बहुत मुश्किल है, लेकिन यह कस्टम फ़ील्ड जोड़ने के लिए उपयोगकर्ता को अधिक लचीलापन देगा –

उत्तर

1

हम लगभग हमारे सभी आवेदन/उत्पादों में उपयोगकर्ता
को दी लचीलेपन के लिए अतिरिक्त विशेषता/क्षेत्र समर्थन जोड़ने की तरह हम एक उत्पाद श्रेणी है, श्रेणी में, ग्राहक किसी भी उत्पाद के अतिरिक्त विशेषता परिभाषित कर सकते हैं
हम क्या कर रहे डीबी स्तर में है:
श्रेणी तालिका में कुछ अतिरिक्त कॉलम हैं जैसे टेक्स्ट वैल्यू सपोर्ट, Num1Att, Num2Att ... संख्या मूल्य समर्थन के लिए, दिनांक 1 एट, Date2Att ... डेटाटाइम मान समर्थन के लिए, ID1Att , ID2Att ... अन्य तालिका से आईडी के लिए समर्थन जैसे आप ड्रॉपडाउन, सूचीबॉक्स, ...
यहां सभी कॉलम में स्ट्रिंग डेटाटाइप है। पाठ बॉक्स; 50; सच; false;
हम यहाँ की दुकान

हम यहाँ मेटा जानकारी संग्रहीत करेगी, Text1Att मेटा के लिए की तरह
एसएसएन है अशक्त;
फ़ील्ड का कैप्शन; नियंत्रण प्रकार; अधिकतम लंबाई; आवश्यक फ़ील्ड है; कस्टम सत्यापन आवश्यक है; कस्टम सत्यापन संदेश;
जन्म स्थान; टेक्स्टबॉक्स; 100; सत्य; सत्य; अमान्य मान;
संख्यात्मक फ़ील्ड के लिए एक ही ...
तारीख के लिए मेटा जानकारी की तरह
जन्म तिथि दिखेगा; कैलेंडर नियंत्रण; सच; सच; अवैध तिथि;
क्षेत्र का कैप्शन; कैलेंडर नियंत्रण या अन्य हो सकता है; आवश्यक है; कस्टम सत्यापन है; कस्टम सत्यापन संदेश;


क्या उत्पाद तालिका में क्या कर रहे हैं स्तंभ की समान संख्या जोड़ सकते हैं और डेटाप्रकार text1Att है, .. varchar, num1Att सांख्यिक है, date1Att datetime है, ID1Att पूर्णांक

क्या हम जीयूआई पक्ष कर रहे हैं है: श्रेणी परिभाषा पृष्ठ में इन गुणों को जोड़ें और रनटाइम पर मेटा जानकारी बनाएं और श्रेणी तालिका
पर स्टोर करें, दूसरी तरफ जब हम श्रेणी में उत्पाद को परिभाषित करते हैं, तो मेटा जानकारी को पढ़ाया जाएगा और श्रेणी तालिका से ट्रैवर्स और अन्य फ़ील्ड जैसे उत्पाद परिभाषा पृष्ठ में पॉप्युलेट किया जाएगा ।


यदि आपको और मदद की ज़रूरत है, तो मैं आपको छवियां प्रदान कर सकता हूं ताकि आप बेहतर ढंग से समझ सकें कि यह कैसे किया जा सकता है।
हम अनुभव कर रहे हैं और विश्लेषण, इतना लचीला दृष्टिकोण है

+1

हालांकि यह समाधान "बदसूरत" लगता है, यह खोज योग्यता के मामले में काफी बेहतर है। स्वीकार्य उत्तर में वर्णित तरीके से इसे कई क्षेत्रों की खोज के लिए बहुत महंगा (प्रदर्शन के संदर्भ में) बनाता है। –

+0

हां, छवियां/और स्यूडोकोड वास्तव में सहायक होगा। धन्यवाद! – Alex

10

एक सारणी है जो फ़ील्ड के नाम और प्रकारों को संग्रहीत करती है।

field_ID  INT 
field_name VARCHAR 
field_type ENUM('int','float','text','richtext') 

एक तालिका रिकॉर्ड तालिका में एक प्रविष्टि, क्षेत्र तालिका में एक प्रविष्टि के लिए एक लिंक, और क्षेत्र मूल्य के लिए एक लिंक भंडार है।

fieldvalue_fieldID INT 
fieldvalue_recordID INT 
fieldvalue_value  BLOB 

को खोजने योग्य बनाना एक और चुनौती है - आपको लगता है कि fieldvalue_value और सूचकांक कि से बाहर किसी भी खोजने योग्य सामग्री हड़पने के लिए की आवश्यकता होगी। यह डेटाबेस-विशिष्ट होगा। MySQL में आप इसे एक टेक्स्ट मान बना सकते हैं और उस पर एक MySQL FULLTEXT अनुक्रमणिका जोड़ सकते हैं।

+0

आपकी आवश्यकता को देखते हुए, यह है शायद चीजों को करने का सबसे सरल तरीका। शुभकामनाएं। –

+1

आह हाँ, ईएवी विरोधी पैटर्न। –

+1

अधिक जानकारी [यहां] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2 % 80% 93value_model) और [यहां] (http://programmers.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios) – thomasrutter

1

आपका सबसे अच्छा विकल्प हैं:

  1. उपयोगकर्ता, अपने स्वयं के डेटाबेस स्कीमा को बदलने के लिए शायद एक मॉड्यूल अपलोड करके या कोई स्क्रिप्ट चलाने से की अनुमति दें।

  2. एक एक्सएमएल क्षेत्र, और एक डेटाबेस है कि अनुक्रमित समर्थन करता है और उस क्षेत्र की सामग्री पर क्वेरी करने

इन मार्टिन Fowler, यहाँ से सिफारिश कर रहे हैं का उपयोग करें: http://martinfowler.com/bliki/UserDefinedField.html

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