जब आप "उपयोगकर्ता परिभाषित फ़ील्ड" प्राप्त करना शुरू करते हैं, जैसा कि अक्सर बग ट्रैकर्स, ग्राहक संसाधन प्रबंधन, और इसी तरह के व्यावसायिक टूल में पाया जाता है कि वे बाज़िल फ़ील्ड के साथ तालिका के साथ समर्थित नहीं हैं (यदि वे हैं, तो संभावना है कि एक समस्या है अपना ही है)।
इसके बजाय आपको जो मिलता है वह है एंटिटी एट्रीब्यूट वैल्यू टेबल डिज़ाइन और संबंधित एडमिनिस्ट्रेशन टूल मान्य विशेषताओं को प्रबंधित करने के लिए।
निम्नलिखित तालिका पर विचार करें:
+ -------------- +
| बात |
| -------------- |
| आईडी |
| प्रकार |
| desc |
| Attr1 |
| Attr2 |
| Attr3 |
| attr4 |
| attr5 |
+ -------------- +
यह आपके द्वारा कुछ विशेषताएँ जोड़ने के बाद है। इसके बजाय attr1
नाटक इसे पढ़ता है artist
या tracks
या genre
या जो भी जिम्मेदार बताते बात है। और 5 के बजाय, क्या हुआ अगर यह 50 था। स्पष्ट रूप से यह असहनीय है। यह एक नए क्षेत्र को संभालने के लिए एप्लिकेशन के मॉडल और पुन: तैनाती के अद्यतन की भी आवश्यकता है। आदर्श नहीं।
अब निम्नलिखित तालिका संरचना पर विचार करें:
+ -------------- + + --------------- + + ------------- +
| बात | | thing_attr | | अटर |
| -------------- | | --------------- | | ------------- |
| आईडी | <--- + | thing_id (fk) | +> | आईडी |
| प्रकार | | attr_id (fk) | + - + | नाम |
| desc | | मूल्य | | |
+ -------------- + + --------------- + + ------------- +
आपको अपनी चीज़ उसके बुनियादी क्षेत्रों से मिल गई है। आपके पास दो और टेबल हैं। विशेषताओं के साथ एक। प्रत्येक फ़ील्ड attr
तालिका में एक पंक्ति है । और फिर तालिका और तालिका thing_attr
से संबंधित विदेशी कुंजियों की एक जोड़ी है । और इसके बाद एक मान फ़ील्ड होता है जहाँ आप उस इकाई के लिए फ़ील्ड का मान जो भी संग्रहीत करते हैं।thing
attr
और अब आपको एक ऐसी संरचना मिल गई है, जहां संपूर्ण तालिका में एटर टेबल को अपडेट किया जा सकता है और समग्र अनुप्रयोग के महत्वपूर्ण प्रभाव के बिना फ्लाई पर नए फ़ील्ड जोड़े जा सकते हैं (या हटाए जा सकते हैं)।
प्रश्न थोड़े अधिक जटिल हैं और सत्यापन अधिक जटिल भी हो जाता है (या तो काया संग्रहित प्रक्रियाएँ या सभी ग्राहक पक्ष)। डिजाइन में इसका व्यापार बंद है।
उस स्थिति पर भी विचार करें जहां किसी दिन आपको माइग्रेशन करने की आवश्यकता होती है और आप इस एप्लिकेशन पर वापस आते हैं कि यह पता लगाने के लिए कि आपके द्वारा मूल रूप से वितरित किए गए स्कीमा की तुलना में अब आधा दर्जन या अधिक गुण हैं। यह बदसूरत पलायन और उन्नयन के लिए बनाता है जहां सही ढंग से उपयोग किए जाने पर इकाई गुण मान तालिका, क्लीनर हो सकती है। (हमेशा नहीं, लेकिन हो सकता है।)
क्या रनटाइम पर स्कीमा को संशोधित करने के लिए कोई डाउनसाइड है? यदि उपयोगकर्ता को लगता है कि किसी चीज़ को एक नई विशेषता की आवश्यकता है, तो बस गतिशील रूप से तालिका में एक स्तंभ जोड़ें?
यदि आप nosql डेटाबेस के उपयुक्त स्वाद के साथ काम कर रहे हैं, तो आप शायद ऐसा कर सकते हैं (ध्यान दें कि इसके लिए nosql का उपयुक्त स्वाद संभवतः एक महत्वपूर्ण-मूल्य वाला स्टोर होगा, जो कि ऊपर वर्णित प्रासंगिक लोगों के लिए EAV तालिका है। बहुत अधिक परेशानी के बिना। हालाँकि, यह नोस्कल के लिए सभी समझौतों के साथ आता है, जो कहीं और बड़े विस्तार से वर्णित हैं।
यदि आप इसके बजाय एक रिलेशनल डेटाबेस पर काम कर रहे हैं - तो आपको स्कीमा की आवश्यकता होगी। स्तंभ को गतिशील रूप से जोड़ने का अर्थ है कि निम्नलिखित चीजों में से कुछ सबसेट सही हैं:
- आप मेटा-डेटाबेस प्रोग्रामिंग कर रहे हैं। एक अच्छे ORM के साथ इस कॉलम को उस क्षेत्र में साफ़-साफ़ मैप करने में सक्षम होने के बजाय, आप शायद ऐसी चीजें कर रहे हैं
select *
और फिर कुछ जटिल कोड बना रहे हैं ताकि यह पता लगाया जा सके कि वास्तव में डेटा क्या है ( जावा का ResultSetMetaData देखें ) और फिर नक्शे में संग्रहीत करना या कुछ अन्य डेटा टाइप - लेकिन कोड में अच्छे क्षेत्र नहीं )। इसके बाद आपके पास पारंपरिक दृष्टिकोण के साथ उचित प्रकार और टाइपो सुरक्षा को फेंक देता है।
- आपने संभवतः ORM को छोड़ दिया है। इसका मतलब है कि आप सिस्टम को आपके लिए काम करने देने के बजाय सभी कोड के लिए कच्चे sql लिख रहे हैं।
- आपने क्लीन अपग्रेड करने पर ध्यान दिया है। क्या होता है जब ग्राहक आपके नाम के साथ एक फ़ील्ड जोड़ता है जो आपका अगला संस्करण भी उपयोग करता है? मैचमेकिंग साइट में अपग्रेड जो
hasdate
टाइमस्टैम्प के भंडारण के लिए एक क्षेत्र जोड़ना चाहता है, पहले से ही hasdate
एक सफल मैच के लिए बूलियन के रूप में परिभाषित किया गया है ... और आपका अपग्रेड टूट जाता है।
- आप भरोसा कर रहे हैं कि ग्राहक कुछ आरक्षित शब्द का उपयोग करके सिस्टम को नहीं तोड़ता है जो आपके प्रश्नों को भी तोड़ देता है ... कहीं।
- आपने खुद को एक डेटाबेस ब्रांड के लिए बाध्य किया है। DDL विभिन्न डेटाबेस के अलग है। डेटाबेस प्रकार इस का सबसे आसान उदाहरण हैं।
varchar2
बनाम text
और पसंद है। कॉलम जोड़ने का आपका कोड MySQL पर काम करेगा लेकिन पोस्टग्रैज या ओरेकल या SQL सर्वर पर नहीं।
- क्या आप वास्तव में डेटा को अच्छी तरह से जोड़ने के लिए ग्राहक पर भरोसा करते हैं ? निश्चित रूप से, ईएवी आदर्श से बहुत दूर है, लेकिन अब आपको कुछ भयावह अस्पष्ट तालिका के नाम मिल गए हैं, जिन्हें आपने डेवलपर को नहीं जोड़ा है, गलत प्रकार के इंडेक्स (यदि कोई हो) के साथ, कोड में कोई बाधा नहीं जोड़ा गया है जहां पर आवश्यकता होती है हो और इतने पर।
- आपने एप्लिकेशन चलाने वाले उपयोगकर्ता को स्कीमा संशोधन विशेषाधिकार दिए हैं। छोटे बॉबी ड्रॉप टेबल्स संभव नहीं हैं जब आप डीडीएल के बजाय एसक्यूएल तक ही सीमित रहते हैं (सुनिश्चित करें कि आप
delete * from students
इसके बजाय कर सकते हैं , लेकिन आप वास्तव में खराब तरीकों से डेटाबेस को गड़बड़ नहीं कर सकते हैं)। किसी दुर्घटना या दुर्भावनापूर्ण गतिविधि स्काईरॉकेट से स्कीमा एक्सेस के साथ कई चीजें गलत हो सकती हैं।
यह वास्तव में "ऐसा न करने के लिए" उबलता है। यदि आप वास्तव में ऐसा चाहते हैं, तो ईएवी तालिका संरचना के एक ज्ञात पैटर्न या एक डेटाबेस के साथ जाएं जो पूरी तरह से इस संरचना के लिए समर्पित है। किसी तालिका में लोगों को मनमाने क्षेत्र न बनाने दें। सिरदर्द अभी इसके लायक नहीं हैं।