क्या विचार अच्छे हैं?


87

मैं सिर्फ एक सामान्य विचार प्राप्त करने की कोशिश कर रहा हूं कि RDBMSes में किन विचारों का उपयोग किया जाता है। यह कहना है, मुझे पता है कि एक दृश्य क्या है और कैसे बनाना है। मुझे यह भी पता है कि मैंने अतीत में उनका क्या उपयोग किया है।

लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मुझे इस बात की पूरी तरह से समझ है कि एक दृश्य क्या उपयोगी है और एक दृश्य किसके लिए उपयोगी नहीं होना चाहिए। अधिक विशेष रूप से:

  1. एक दृश्य किसके लिए उपयोगी है?
    • क्या कोई ऐसी स्थिति है जिसमें किसी एक का उपयोग नहीं करना चाहिए, जब आप किसी दृश्य का उपयोग करना चाहते हैं?
    • आप टेबल-वैल्यू फ़ंक्शन या इसके विपरीत कुछ के बदले में एक दृश्य का उपयोग क्यों करेंगे?
    • क्या ऐसी कोई परिस्थितियां हैं जो एक नज़रिया उपयोगी हो सकती हैं जो पहली नज़र में स्पष्ट नहीं हैं?

(और रिकॉर्ड के लिए, इनमें से कुछ प्रश्न जानबूझकर भोले हैं। यह आंशिक रूप से एक अवधारणा जांच है।)


1
इसी तरह के सवाल यहाँ पोस्ट किए गए हैं: stackoverflow.com/questions/1278521/…
MedicMan

मुझे लगता है कि stackoverflow.com/questions/1278521/… इस प्रश्न के बेहतर उत्तर प्रदान करते हैं।
गीनटॉनिक

जवाबों:


42

1) एक दृश्य किसके लिए उपयोगी है?

IOPO केवल एक स्थान पर

• चाहे आप डेटा पर विचार करें या शामिल तालिकाओं का संदर्भ देने वाले प्रश्न, एक दृश्य का उपयोग अनावश्यक अनावश्यकता से बचा जाता है।

• दृश्य तालिकाओं के लिए सीधी पहुंच (और परिणामस्वरूप शारीरिक निर्भरता को संदर्भित करने वाले हथकड़ी) को रोकने के लिए एक अमूर्त परत भी प्रदान करते हैं। वास्तव में, मुझे लगता है कि आपके अंतर्निहित डेटा (विचारों और तालिका-मूल्यवान कार्यों का उपयोग करके) में केवल सारगर्भित पहुँच प्रदान करना अच्छा अभ्यास 1 है, इसमें 1 I hafta admit जैसे विचार भी शामिल हैं, "जैसा मैं कहता हूँ, वैसा ही करें"; उस सलाह में ";)

CREATE VIEW AS
      SELECT * FROM tblData


2) क्या ऐसी कोई परिस्थितियां हैं जिनमें किसी एक का उपयोग नहीं करने पर किसी दृश्य का उपयोग करने के लिए लुभाता है?

देखने में प्रदर्शन एक चिंता का विषय था (जैसे SQL 2000)। मैं कोई विशेषज्ञ नहीं हूं, लेकिन मैंने थोड़ी देर में इसके बारे में चिंता नहीं की। (और न ही मैं यह सोच सकता हूं कि मैं वर्तमान में व्यू जॉइन का उपयोग कहां कर रहा हूं।)

एक अन्य स्थिति जहां एक दृश्य ओवरकिल हो सकता है, जब दृश्य केवल एक कॉलिंग स्थान से संदर्भित होता है और इसके बजाय एक व्युत्पन्न तालिका का उपयोग किया जा सकता है। जैसे अनाम वर्ग में एक वर्ग के लिए बेहतर है। ठीक उसी प्रकार यदि अनाम प्रकार का उपयोग केवल एक बार किया जाता है।

    • http://msdn.microsoft.com/en-us/library/ms177634.aspx में व्युत्पन्न तालिका विवरण देखें

3) आप टेबल-वैल्यू फ़ंक्शन या इसके विपरीत कुछ के बदले में एक दृश्य का उपयोग क्यों करेंगे?

(प्रदर्शन कारणों के अलावा) एक तालिका-मूल्यवान फ़ंक्शन कार्यात्मक रूप से एक पैरामीटर दृश्य के बराबर है। वास्तव में, एक सामान्य साधारण टेबल-वैल्यू फंक्शन यूसेज केस एक ऑब्जेक्ट में पहले से मौजूद व्यू के लिए WHERE क्लॉज फिल्टर जोड़ने के लिए है।

4) क्या ऐसी कोई परिस्थितियां हैं जो एक नज़र उपयोगी हो सकती हैं जो पहली नज़र में स्पष्ट नहीं हैं?

मैं अपने सिर के शीर्ष के किसी भी गैर-स्पष्ट उपयोग के बारे में नहीं सोच सकता। (मुझे लगता है अगर मैं कर सकता था, कि उन्हें स्पष्ट कर देगा;)

9
मैं इस बात से सहमत नहीं हूँ कि जब टेबल का चयन किया जाता है तो यह एक दृश्य का निर्माण करने के लिए समझ में आता है। क्या आप इस बारे में स्पष्टीकरण दे सकते हैं कि यह क्यों फायदेमंद होगा?
पंजीकृत उपयोगकर्ता

IOPO - केवल एक स्थान पर - क्या यह एक प्रसिद्ध डिज़ाइन वाक्यांश है? मैं इसके लिए कई संदर्भ खोजने के लिए नहीं कर सकते? क्या इसके अन्य रूप हैं, जैसे DRY?
रॉबर्ट

1
@ रॉबर्ट यस, डीआरवाई, नॉर्मलाइजेशन, आईओपीओ, ये सभी एक ही दर्शन के अलग-अलग फ्लेवर हैं।
टायलरएच

45

एक तरह से, एक दृश्य एक इंटरफेस की तरह है। आप अपनी इच्छित तालिका संरचना को बदल सकते हैं, लेकिन दृश्य कोड को बदलने की ज़रूरत नहीं है।

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


21

सुरक्षा प्रदान करने के लिए दृश्यों का उपयोग किया जा सकता है (अर्थात: उपयोगकर्ताओं के पास उन विचारों तक पहुंच हो सकती है जो केवल किसी तालिका में कुछ स्तंभों तक पहुँच प्राप्त करते हैं), विचार अपडेट, आवेषण आदि के लिए अतिरिक्त सुरक्षा प्रदान कर सकते हैं। दृश्य भी अन्य स्तंभ नाम (जैसा कि करते हैं) प्रदान करते हैं sp's) लेकिन दृश्य वास्तविक तालिका से एक अलगाव के अधिक हैं।


18

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


-1 "विचार निरूपित करें"? क्षमा करें, लेकिन यह बकवास है जब तक कि यह किसी तरह योग्य न हो।
बस किसी

18
वे पूरी तरह से बदनाम करते हैं। यदि आपके पास संबंधित तालिकाएँ हैं जो कि 3 नाममात्र के रूप में सामान्यीकृत हैं और आप उस संबंध को 'समतल' करने के लिए एक दृश्य बनाते हैं, तो यह कैसे नामकरण नहीं है?
Kilhoffer

11

दूसरों ने जो बताया है, उसके अलावा, अनुप्रयोग से अधिक जटिल SQL प्रश्नों को हटाने के लिए विचार भी उपयोगी हो सकते हैं।

एक आवेदन के बजाय एक उदाहरण के रूप में:

sql = "तालिका 1 से बी, तालिका 2 से एक, बी चुनें;"

आप इसे एक नज़र में सार कर सकते हैं:

व्यू यूनियन_टेस्टी_टेबल 2_v बनायें जैसा कि टेबल
1 से बी चुनें, टेबल 2 से
यूनियन
ए, बी चुनें

और एप्लिकेशन कोड में, बस:

sql = "Union_table1_table2_v से a, b चुनें;"

यदि डेटा संरचनाएं कभी भी बदलती हैं, तो आपको ऐप कोड, recompile और redeploy को बदलना नहीं पड़ेगा। आप सिर्फ db में दृश्य बदलेंगे।


क्यों मैं अनुप्रयोग के बजाय डेटाबेस में जटिल sql लिखना चाहता हूँ?
इवान विरबायन

3
आपकी क्वेरी जितनी जटिल होगी, भविष्य में उसके बदलने की संभावना उतनी ही अधिक होगी, क्योंकि आंशिक रूप से इसकी वजह से अधिक तालियां बजती हैं। जब DB संरचनाएं बदलती हैं, तो आपको अपना कोड भी बदलना होगा, और एक रिलीज करना होगा। यदि यह जटिलता एक दृश्य में सारगर्भित है, तो डीबीए आपके कोड को बदलने के बिना अंडरलिंग टेबल में संरचनात्मक परिवर्तन करने में सक्षम हो सकता है।
कोडिंगविथस्पीक

11

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


6

ओपी ने पूछा कि क्या ऐसी परिस्थितियां हैं जहां किसी दृश्य का उपयोग करना आकर्षक हो सकता है, लेकिन यह उचित नहीं है।

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

उदाहरण के लिए, मान लें कि आपको तालिकाओं A, B, C और D को एक साथ जोड़ना है। आपको टेबल ए और बी के बाहर और सी एंड डी के बाहर का दृश्य बनाने के लिए लुभाया जा सकता है, फिर दोनों विचारों को एक साथ जोड़ दें। एक प्रश्न में केवल A, B, C और D को जोड़ना बेहतर है।


मुझे नहीं लगता कि यह सही है, कम से कम यह नहीं है कि डीबीएमएस सिद्धांत कैसे जाता है (विभिन्न कार्यान्वयन सिद्धांत का सम्मान नहीं करने का निर्णय ले सकते हैं)। क्वेरी पार्सर अनिवार्य रूप से संबंधित sql के साथ देखे जाने वाले किसी भी विचार को बदल देगा, और अनुकूलक वहां से जाएगा। 2 मामलों के बराबर होना चाहिए।
स्क्वायरकॉग

यह भी सही नहीं है जब आप अपने विचारों में अनुक्रमणिका जोड़ सकते हैं।
इसके बाद

मैं PostgreSQL से सबसे अधिक परिचित हूं और पहले के संस्करण प्रश्नों के संयोजन के बारे में बहुत अच्छे नहीं थे। लेकिन नए वाले ज्यादा बेहतर हैं। मेरा जवाब इतना अधिक लागू नहीं होता है, कम से कम इस विशेष DBMS के लिए।
बैरी ब्राउन

5

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


4

अब तक की गई प्रतिक्रियाएँ सही हैं - सुरक्षा, विकेंद्रीकरण प्रदान करने के लिए विचार अच्छे हैं (हालाँकि उस सड़क पर बहुत दर्द हो रहा है अगर गलत किया गया है), डेटा मॉडल अमूर्त, आदि।

इसके अलावा, व्यापार तर्क को लागू करने के लिए आमतौर पर विचारों का उपयोग किया जाता है (एक व्यपगत उपयोगकर्ता एक ऐसा उपयोगकर्ता है जिसने पिछले 40 दिनों में लॉग इन नहीं किया है, वह चीज है)।


यदि आप 7 संदर्भ तालिकाओं में चमकते हुए निरूपित करते हैं, और फिर किसी ऐसी चीज़ के लिए क्वेरी करते हैं, जो केवल उन संदर्भ तालिकाओं में से एक की आवश्यकता होती है। वह बहुत व्यर्थ प्रयास है। यह बदतर हो जाता है अगर आप इस तरह के विचारों में शामिल होने लगते हैं।
वर्गाकार को

क्या तुम इसके बारे में निश्चित हो? MSDN का कहना है 'जब SQL सर्वर नाम से विचारों को संदर्भित करता है, तो प्रश्नों की परिभाषा सामान्य रूप से विस्तारित हो जाती है, जब तक कि वे केवल आधार तालिकाओं के लिए संदर्भित न हों। इस प्रक्रिया को दृश्य विस्तार कहा जाता है। यह स्थूल विस्तार का एक रूप है। ' मुझे लगता है कि विस्तार की प्रक्रिया के दौरान, इंजन में केवल अंतर्निहित तालिकाओं (दृश्य) को शामिल करने के लिए पर्याप्त स्मार्ट होगा जो क्वेरी द्वारा आवश्यक हैं।
एंथनी

एंथोनी, एक क्वेरी की कल्पना करें जैसे कि "foo_col from (select foo। *, Bar। *। Foo से bar bar। पर क्लिक करें। foo.id = bar.id)"। इस क्वेरी में, इनर सेलेक्ट हमारा विचार है। यह नहीं है। स्पष्ट करें कि बार जॉइन को सुरक्षित रूप से गिराया जा सकता है (वास्तव में यदि संबंध 1-1 से सख्ती से नहीं है, तो यह नहीं हो सकता है)। यह अधिक जटिल प्रश्नों के साथ भी पेचीदा हो जाता है, और मैं सभी को करने के लिए सामान्य RDBMS पर निर्भर होने की सलाह नहीं दूंगा। मानव
कैन प्रूनिंग

3

आपकी SQL स्क्रिप्ट्स में बार-बार जटिल जॉयइन स्टेटमेंट को देखने से दृश्य सहेजे जाते हैं। आप बस कुछ दृश्य में कुछ जटिल JOIN को इनकैप्सुलेट कर सकते हैं और जब भी जरूरत हो अपने SELECT स्टेटमेंट में कॉल कर सकते हैं। यह कभी-कभी हर क्वेरी में शामिल होने वाले बयानों को लिखने की तुलना में आसान, सीधा आगे और आसान होगा।


2

एक दृश्य केवल एक संग्रहीत है, जिसका नाम SELECT स्टेटमेंट है। पुस्तकालय कार्यों की तरह विचार करें।


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

1

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


1

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

मुझे नहीं पता कि क्या डीबी एक बार या एक बार देखने के बाद एक बार देखने का मूल्यांकन करेगा। किसी को पता है? यदि पूर्व, एक दृश्य का उपयोग कर प्रदर्शन में सुधार होगा।


ओरेकल सीबीओ एक बार दृश्य का मूल्यांकन करने के लिए चुन सकता है (भौतिक करें, वे इसे कहते हैं) या एसक्यूएल को बाकी के चयनित बयान में देखने के लिए मर्ज करें और इसे चलाएं। यह तय करेगा कि निम्न अनुमानित लागत क्या थी।
डब्ल्यूडब्ल्यू।

यदि चयन कथन पूरे क्वेरी में स्थिर था और बस कई बार दोहराया गया था, तो एक सामान्य तालिका अभिव्यक्ति (CTE) समस्या को हल कर सकती है। यह केवल SQL Server 2005/2008 पर लागू होता है क्योंकि यह SQL Server 2000 में उपलब्ध नहीं था। हाँ, एक दृश्य अभी भी बार-बार लागू किया गया होगा।
पंजीकृत उपयोगकर्ता

@ पंजीकृत उपयोगकर्ता: CTE की SQL सर्वर विशेषता नहीं है। वे DB2 में उत्पन्न हुए और पोस्टग्रेक्यूएल में भी मौजूद हैं (क्योंकि वे उपयोगी हैं और आईएसओ एसक्यूएल मानक में हैं)। चाहे दृश्य ब्लैकलाइन के रूप में इनलाइन हो या ट्रीट किया गया हो, कार्यान्वयन-विशिष्ट है, कुछ RDBMS दूसरों की तुलना में अधिक स्मार्ट हैं।
बस किसी ने

@ अन्याय किसी: मेरी टिप्पणी SQL सर्वर 2005/2008 तक ही सीमित थी क्योंकि मुझे CTE के साथ अन्य RBDMS में अनुभव नहीं है। इसके अलावा, टिप्पणी यह ​​इंगित करने के लिए योग्य थी कि यह SQL Server 2000 पर लागू नहीं होता है क्योंकि 2005 से पहले CTE SQL सर्वर में उपलब्ध नहीं थे।
पंजीकृत उपयोगकर्ता

देखने के लिए एक अन्य विकल्प मूल्य तालिका को पहले से एक अस्थायी तालिका में रखना होगा।
सीड्राइव

0

कभी भी आपको [my_interface]! = [User_interface] की आवश्यकता है।

उदाहरण:

टेबल ए:

  • आईडी
  • जानकारी

टेबल ए के लिए देखें:

  • ग्राहक सूचना

यह एक ऐसा तरीका है जिससे आप ग्राहक से आईडी छिपा सकते हैं और एक ही बार में एक अधिक क्रिया नाम के लिए जानकारी का नाम बदल सकते हैं।

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

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