डोमेन के लिए या डोमेन के लिए नहीं


15

SQL92 और SQL99 मानक DDL निर्माण को परिभाषित करते हैं । सभी डेटाबेस इसका समर्थन नहीं करते हैं, या इसके लिए एक अलग नाम है (SQL सर्वर में उपयोगकर्ता परिभाषित प्रकार हैं , उदाहरण के लिए)।CREATE DOMAIN

ये अनुमत डेटाबेस से संबंधित नियमों को सरल और लागू करने के लिए अपने डेटाबेस में उपयोग किए जाने वाले एक विवश डेटा-प्रकार को परिभाषित करने की अनुमति देते हैं। इस तरह के डेटा-प्रकार का उपयोग स्तंभ घोषणाओं में किया जा सकता है, संग्रहित प्रक्रियाओं और कार्यों आदि के इनपुट और आउटपुट में ...

मैं जानना चाहता हूँ:

  • क्या लोग वास्तव में अपने डेटाबेस डिजाइन में डोमेन का उपयोग करते हैं?
  • यदि ऐसा है, तो किस हद तक?
  • वे कितने उपयोगी हैं?
  • आपको क्या नुकसान हुआ है?

मैं भविष्य के डेटाबेस के विकास में इन का उपयोग करने की व्यवहार्यता का आश्वासन देने की कोशिश कर रहा हूं।


1
मैं यह भी जानना चाहूंगा ... मुझे यह सुनने में दिलचस्पी है कि लोगों को क्या कहना है।
maple_shaft

जवाबों:


2

हमेशा की तरह...

निर्भर करता है

क्या आपके पास एक से अधिक स्थानों पर उपयोग की जाने वाली एक डोमेन इकाई है जो मूल रूप से समर्थन करती है अन्यथा उन्हें काफी प्रयास और / या अनावश्यक बाधाओं और व्यवहारों की आवश्यकता होगी ?

यदि ऐसा है, तो डोमेन दूर। यदि नहीं, तो परेशान मत करो।

मैंने उपरोक्त ह्यूरिस्टिक के आधार पर SQL सर्वर में एक बार उपयोगकर्ता-परिभाषित प्रकार बनाना आवश्यक पाया है। मुझे यह भी याद नहीं है कि यह क्या था - लेकिन इसके कारण अधिक काम बचा।


5

SQL सर्वर और C # के उपयोगकर्ता के रूप में, मैंने डेटाबेस में उपयोगकर्ता परिभाषित प्रकारों का उपयोग नहीं किया है, क्योंकि मैं एप्लिकेशन पक्ष में बहुत अधिक शक्तिशाली हूं। LINQ to SQL और Entity फ्रेमवर्क जैसे ORMs के बाद की घटना, सर्वर क्षमताओं के मेरे उपयोग में बहुत कमी आई है।

उदाहरण के लिए, मैं .NET के वैश्वीकरण की शक्ति के आधार पर ग्रेगोरियन तिथि-समय को अन्य स्वरूपों में स्थानांतरित करने के लिए SQL सर्वर में कुछ डेटटाइम रूपांतरण कार्यों को लोड करने के लिए सीएलआर एकीकरण का उपयोग कर रहा था। लेकिन अब, चीजें अलग हैं, और मैं अब ऐसा नहीं करता हूं। मैं केवल डेटा लोड करता हूं, और ट्रांसफ़ॉर्मेशन करता हूं, मेरे एप्लिकेशन लेयर में।

इसलिए, लगभग 4 वर्षों की प्रोग्रामिंग और उन सभी टीमों का निरीक्षण करने के बाद, जिनके बारे में मैं सोच सकता हूं, मैंने उपयोगकर्ता परिभाषित प्रकारों का उपयोग करने का कोई नमूना नहीं पाया है। मैंने इसे कई .NET ब्लॉग्स में एक्शन में भी नहीं देखा है।

हालांकि इसका मतलब यह नहीं है कि लोग डेटाबेस डोमेन का उपयोग नहीं करते हैं , लेकिन निश्चित रूप से इसका मतलब है कि कम से कम डेटाबेस डोमेन का उपयोग करना आम नहीं है।


"मैंने डेटाबेस में उपयोगकर्ता परिभाषित प्रकारों का उपयोग नहीं किया है, क्योंकि मैं आवेदन पक्ष में बहुत अधिक शक्तिशाली हूं" : इसलिए आप इसके बजाय बाधाओं का उपयोग करते हैं? मुझे समझ नहीं आ रहा है, यह आवेदन के दृष्टिकोण से कैसे अलग है?
आर्सेनी मूरज़ेंको

@MainMa, उदाहरण के लिए, मैं डेटाबेस लेयर में छात्र वर्ग नहीं बनाता । मैं केवल सभी आदिम डेटा प्रकार वाले छात्रों की एक तालिका बनाता हूं, जैसे पूर्णांक और स्ट्रिंग, और फिर ओआरएम का उपयोग करके, मैं किसी भी रिकॉर्ड को एप्लिकेशन में किसी ऑब्जेक्ट पर मैप करता हूं।
सईद निमाती

समझ लिया। आप सही हे।
आर्सेनी मूरज़ेंको

3

स्टैक ओवरफ्लो पर पहले से ही एक विस्तृत जवाब है । मैं ज्यादातर इसके साथ सहमत हूं, लेकिन दिए गए उदाहरण के साथ नहीं, मैं बोली:

"उदाहरण के लिए, मैं एक" जेंडरटाइप "(चार) को परिभाषित करता हूं, अशक्त नहीं," एम "या" एफ "को पकड़कर) यह सुनिश्चित करता है कि लिंग क्षेत्र में केवल उचित डेटा की अनुमति है।"

व्यक्तिगत रूप से, मैं char(1)स्तंभ पर एक बाधा स्थापित करने और परिभाषित करने में अधिक सहज महसूस करता हूं । जब बाधा का उल्लंघन किया जाता है, तो मुझे पता है कि मुझे क्या गलत करना है, यह जानने के लिए खोज करना चाहिए। यह उपयोगकर्ता द्वारा परिभाषित प्रकारों से भी अधिक ज्ञात है, इसलिए डेटाबेस जो केवल बाधाओं का उपयोग करता है, एक शुरुआत के लिए समझना आसान होगा।

बेशक, सिर्फ एक निजी राय है। अन्य लोग कहेंगे कि एक in ('M', 'F')बाधा स्व-दस्तावेजीकरण नहीं है और एक नए डेवलपर के लिए बहुत ही अस्पष्ट हो सकती है जो डेटाबेस का पता लगाता है।

IMO, अधिक जटिल प्रकारों के लिए उपयोगकर्ता परिभाषित प्रकारों का उपयोग करें, और कुछ बुनियादी चीज़ों के लिए बाधाएँ। इसके अलावा, जब आप आसानी से एक प्रकार के लिए एक स्पष्ट नाम नहीं पा सकते हैं, तो एक मौका है कि एक बाधा बेहतर फिट होगी।


हेर्मैफ्रोडाइट्स के बारे में क्या?
वायट बार्नेट

या इंटरसेक्स? या ट्रांसपोटर्स?
ब्रोक

1

मैंने स्वयं इस सुविधा का उपयोग नहीं किया है लेकिन मुझे लगता है कि आपको यह सुनिश्चित करने की आवश्यकता है कि:

  1. यदि आपके डेटाबेस का उपयोग किसी एकल सिस्टम द्वारा किया जाता है, तो यह समझ में नहीं आ सकता है कि इस सुविधा का उपयोग न करें और अपनी व्यावसायिक परत या इसके समकक्ष में चेक लॉजिक जोड़ें। इससे आपको सत्यापन में अधिक लचीलापन मिलेगा (नियमित अभिव्यक्तियों का उपयोग करने में कहेंगे) और एक ही स्थान पर सभी सत्यापन तर्क को अलग करना संभव बना देगा। यदि आपका डेटाबेस कई प्रणालियों द्वारा साझा किया जाता है, तो आप इसके बजाय ट्रिगर्स का उपयोग कर सकते हैं जो इस कार्य के लिए अच्छी तरह से अनुकूल हैं।

  2. मुझे यकीन नहीं है कि अगर UDT आपको एक सत्यापन त्रुटि का सामना करने पर क्लाइंट को दिए गए त्रुटि संदेशों को अनुकूलित करने की अनुमति देता है।

  3. यूडीटी बहुत उपयोगी हैं यदि एक ही सत्यापन नियम कई कॉलमों पर लागू होता है। मेरी राय में, मैं इसे सामान्यीकृत डेटाबेस डिज़ाइन के साथ व्यावसायिक अनुप्रयोग में बहुत सामान्य मामले के रूप में नहीं देखता हूं।

आपको "SQL सर्वर] उपयोगकर्ता-परिभाषित प्रकार" के बारे में जानने में रुचि हो सकती है ? ब्लॉग लेख।


1
तीसरे अंक के लिए +1। एक ही बाधा को बार-बार लिखना जैसा कि मैं करता हूं, यह करना सबसे अच्छी बात नहीं है, खासकर जब बाधा समय के साथ बदल सकती है, इसे कई जगहों पर बदलने की आवश्यकता होती है।
आर्सेनी मूरज़ेंको

0

जब आप कहते हैं "सभी डेटाबेस इसका समर्थन नहीं करते हैं", मुझे लगता है कि इसे लगाने का एक बेहतर तरीका निम्नलिखित है:

प्रत्येक प्रमुख डेटाबेस इसका समर्थन करता है, क्योंकि वे बड़े पैमाने पर ट्रिगर, फ़ंक्शन और अन्य उन्नत सुविधाओं का समर्थन करते हैं।

यह हमें इस निष्कर्ष पर पहुंचाता है कि यह उन्नत SQL का हिस्सा है और कुछ बिंदु पर समझ में आता है।

Do people actually use domains in their database designs?

आवश्यक कवरेज के कारण कम संभव है, (ऑपरेटरों, अनुक्रमित आदि पर विचार करते हुए)

If so to what extent?

फिर से, जैसा कि सीमित हो सकता है, यदि एक मौजूदा प्रकार थोड़ा अतिरिक्त परिभाषित तर्क (यानी चेक आदि) के साथ संयुक्त हो सकता है, तो वह क्यों कर सकता है?

How useful are they?

काफी सारा। आइए एक दूसरे के लिए MySQL की तरह एक अच्छा-अच्छा DBMS पर विचार करें, जिसे मैंने एक कारण के लिए इस उदाहरण के लिए चुना है: यह inet (IP पता) प्रकार के लिए अच्छे समर्थन का अभाव है।

अब आप एक ऐसा एप्लिकेशन लिखना चाहते हैं, जो ज्यादातर IP डेटा पर केंद्रित है, जैसे रेंज और वह सब, और आप डिफ़ॉल्ट प्रकार और इसकी सीमित कार्यक्षमता के साथ फंस गए हैं, आप या तो अतिरिक्त फ़ंक्शन और ऑपरेटर लिखेंगे (जैसे कि पोस्टग्रेक्यूएल में मूल रूप से समर्थित हैं) उदाहरण) या आपके द्वारा आवश्यक प्रत्येक कार्यक्षमता के लिए बहुत अधिक जटिल प्रश्न लिखें।

यह एक ऐसा मामला है जहां आप आसानी से अपने स्वयं के कार्यों (inet >> ing in PostgreSQL: रेंज ऑपरेटर में निहित) को परिभाषित करने में लगने वाले समय को उचित ठहराएंगे।

उस बिंदु पर, आपने पहले से विस्तारित डेटाटाइप समर्थन को उचित ठहराया है, एक नया डेटाटाइप को परिभाषित करने के लिए केवल एक अन्य चरण है।

अब वापस PostgreSQL के पास जो वास्तविक अच्छा प्रकार का समर्थन है, लेकिन कोई अहस्ताक्षरित int नहीं है .. जिसकी आपको आवश्यकता है, क्योंकि आप वास्तव में भंडारण / प्रदर्शन (जो जानते हैं ...) के बारे में चिंतित हैं, अच्छी तरह से आपको इसे जोड़ने की आवश्यकता होगी ऑपरेटर्स - हालांकि बेशक यह ज्यादातर मौजूदा इंट ऑपरेटर्स व्युत्पन्न कर रहा है।

What pitfalls have you encountered?

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

सबसे बड़ा मुद्दा जो मैं देख रहा हूँ, वह पहिया को सुदृढ़ करना होगा, "सुरक्षित" परत (db) में बगों का परिचय देना, अपूर्ण प्रकार का समर्थन जिसे आप केवल महीनों बाद महसूस करेंगे जब आपका CONCAT (कास्ट * AS varchar) विफल हो जाता है क्योंकि आप एक कास्ट (न्यूटाइप के रूप में) को परिभाषित नहीं किया, आदि।

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

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

यूडीटी का अनुकूलन के लिए एक अच्छा समाधान हो सकता है, चार्ट (1) का उपयोग करके एम / एफ प्रकार के बारे में एक और जवाब में एक अच्छा उदाहरण दिया गया है। यदि यह UDT होता, तो इसके बजाय एक बूलियन हो सकता था (जब तक कि हम तीसरे और चौथे विकल्प की पेशकश नहीं करना चाहते)। बेशक हम सभी जानते हैं कि यह वास्तव में कॉलम ओवरहेड के कारण अनुकूलन नहीं है, लेकिन संभावना है।


विशिष्ट सुविधा (DOMAINs) सभी डेटाबेस द्वारा समर्थित नहीं है। हां, ट्रिगर्स, बाधाओं और कार्यों का उपयोग करके आप इसका अनुकरण कर सकते हैं, लेकिन यह इसे एक समर्थित सुविधा नहीं बनाता है।
ऊद

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

0

कागज पर, यूडीटी एक महान अवधारणा हैं। वे आपको अपने DB को सही मायने में सामान्य करने की अनुमति देते हैं (उदाहरण के लिए जब आपके पास दो स्तंभ हैं जो एक दूसरे पर निर्भर हैं), और आपके नए प्रकार से संबंधित किसी भी तर्क को अतिक्रमण करने के लिए भी।

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

एक प्रकार का सबसे अच्छा उदाहरण जो UDT के रूप में सबसे अच्छा किया जाता है (यदि यह पहले से मौजूद नहीं था) hierarchyid( MSDN ) होना चाहिए । कुशल बने रहने के लिए, यह एक द्विआधारी प्रारूप में अपने मूल्य को संग्रहीत करता है (जैसा कि सामान्य varchar कस्टम कार्यान्वयन के विपरीत), जो कि प्रकार के कार्यों के बिना बनाए रखने के लिए बोझिल होगा। बाहरी कार्यों के विपरीत, 10 या तो तरीके जो प्रकार प्रदान करते हैं, सर्वोत्तम प्रकार के भाग के रूप में भी प्रदान किए जाते हैं। मैं इस तरह के मामलों में कस्टम प्रबंधित UDT का उपयोग करने पर विचार करूंगा - जहां एक अलग प्रकार के रूप में एक कुशल और साफ-सुथरा कार्यान्वयन प्रदान करके एक महत्वपूर्ण लाभ होना चाहिए।


0

एक अधिक व्यावहारिक प्रश्न / उत्तर। क्या आपकी कंपनी इसका उपयोग करने की अनुमति देती है?

इसकी आपकी कंपनी कई DBSQL ब्रांडों के साथ काम कर रही है जो अलग-अलग DDL को संभालते हैं?

प्रत्येक डेटाबेस ब्रांड उपयोगकर्ता परिभाषित प्रकारों की तरह अच्छी अतिरिक्त सुविधाएँ प्रदान कर सकता है, लेकिन, यदि आपकी कंपनी कई DB का उपयोग करती है, तो आपको गैर मानक सुविधाओं से परेशानी हो सकती है।

यदि कंपनी केवल आपकी है, या आप तय कर सकते हैं कि आप किस डेटाबेस और सुविधाओं का उपयोग करने जा रहे हैं, तो आप डीडीएल का उपयोग कर सकते हैं

मेरे पास कई परियोजनाओं के साथ काम है जहां एक उपयोगकर्ता परिभाषित प्रकार उपयोगी हो सकता है, लेकिन, मुझे अधिक मानक सुविधाओं से चिपके रहना चाहिए, क्योंकि हमें कई डीबी से निपटना था। (रों)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.