डेटाबेस विकास आवेदन डेवलपर्स द्वारा की गई गलतियाँ [बंद]


566

एप्लिकेशन डेवलपर्स द्वारा की गई सामान्य डेटाबेस डेवलपमेंट गलतियाँ क्या हैं?


के पास नकल stackoverflow.com/questions/346659/...
dkretz

जवाबों:


1002

1. उपयुक्त सूचकांकों का उपयोग नहीं करना

यह अपेक्षाकृत आसान है, लेकिन फिर भी यह हर समय होता है। विदेशी कुंजी उन पर अनुक्रमित होनी चाहिए। यदि आप एक क्षेत्र का उपयोग कर रहे हैं, तो आपको WHERE(शायद) उस पर एक सूचकांक होना चाहिए। इस तरह के सूचकांक को अक्सर आपके द्वारा निष्पादित किए जाने वाले प्रश्नों के आधार पर कई स्तंभों को कवर करना चाहिए।

2. संदर्भात्मक अखंडता को लागू नहीं करना

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

MySQL डेटाबेस पर इस विफलता को देखना काफी आम है। मुझे विश्वास नहीं होता कि MyISAM इसका समर्थन करता है। InnoDB करता है। आपको ऐसे लोग मिलेंगे जो MyISAM का उपयोग कर रहे हैं या जो InnoDB का उपयोग कर रहे हैं, लेकिन वैसे भी इसका उपयोग नहीं कर रहे हैं।

यहां अधिक:

3. सरोगेट (तकनीकी) प्राथमिक कुंजी के बजाय प्राकृतिक का उपयोग करना

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

मेरी राय में आपको हमेशा सरोगेट की का उपयोग करना चाहिए । इन सवालों में यह मुद्दा सामने आया है:

यह कुछ हद तक विवादास्पद विषय है जिस पर आपको सार्वभौमिक सहमति नहीं मिलेगी। जब आप कुछ लोगों को मिल सकते हैं, जो सोचते हैं कि प्राकृतिक कुंजी कुछ स्थितियों में ठीक है, तो आपको यकीनन अनावश्यक होने के अलावा सरोगेट कुंजी की कोई आलोचना नहीं मिलेगी। अगर आप मुझसे पूछें तो यह काफी छोटा है।

याद रखें, यहां तक ​​कि देश भी अस्तित्व में नहीं रह सकते हैं (उदाहरण के लिए, यूगोस्लाविया)।

4. DISTINCTकाम करने के लिए आवश्यक क्वेरी लिखना

आप अक्सर इसे ORM- जनरेट किए गए प्रश्नों में देखते हैं। हाइबरनेट से लॉग आउटपुट को देखें और आप देखेंगे कि सभी प्रश्न निम्नलिखित हैं:

SELECT DISTINCT ...

यह सुनिश्चित करने के लिए कि आप डुप्लिकेट पंक्तियों को वापस न करें और इस प्रकार डुप्लिकेट ऑब्जेक्ट प्राप्त करें, यह एक शॉर्टकट है। आप कभी-कभी लोगों को ऐसा करते हुए देखेंगे। यदि आप इसे बहुत अधिक देखते हैं तो यह एक वास्तविक लाल झंडा है। ऐसा नहीं है कि DISTINCTबुरा है या वैध आवेदन नहीं है। यह (दोनों मायने रखता है) करता है लेकिन यह सही प्रश्न लिखने के लिए सरोगेट या स्टॉपगैप नहीं है।

क्यों मैं नफरत से नफरत करता हूँ :

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

5. जॉइनिंग से अधिक एग्रीगेशन

डेटाबेस एप्लिकेशन डेवलपर्स द्वारा एक और सामान्य गलती यह महसूस नहीं करना है कि कितना महंगा एकत्रीकरण (यानी GROUP BYक्लॉज) की तुलना जॉइन की जा सकती है।

आपको यह अनुमान लगाने के लिए कि यह कितना व्यापक है, मैंने इस विषय पर कई बार यहां लिखा है और इसके लिए बहुत कुछ लिखा गया है। उदाहरण के लिए:

से SQL विवरण - "द्वारा और होने समूह" बनाम "में शामिल होने" :

पहली क्वेरी:

SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP by userid
HAVING COUNT(1) = 3

क्वेरी समय: 0.312 एस

दूसरी क्वेरी:

SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3
AND t1.roleid = 1

क्वेरी समय: 0.016 एस

ये सही है। जो संस्करण मैंने प्रस्तावित किया वह कुल संस्करण की तुलना में बीस गुना तेज है।

6. विचारों के माध्यम से जटिल प्रश्नों को सरल नहीं करना

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

  • पार्टी : लोग और संगठन;
  • पार्टी भूमिका : उन दलों ने जो किया, उदाहरण के लिए कर्मचारी और नियोक्ता;
  • पार्टी भूमिका संबंध : कैसे एक दूसरे से संबंधित भूमिकाएँ।

उदाहरण:

  • टेड एक व्यक्ति है, जो पार्टी का एक उपप्रकार है;
  • टेड की कई भूमिकाएँ हैं, जिनमें से एक कर्मचारी है;
  • इंटेल एक संगठन है, जो एक पार्टी का उपप्रकार है;
  • इंटेल की कई भूमिकाएँ हैं, जिनमें से एक नियोक्ता है;
  • इंटेल टेड को नियुक्त करता है, जिसका अर्थ है कि उनकी संबंधित भूमिकाओं के बीच एक संबंध है।

इसलिए टेड को अपने नियोक्ता से जोड़ने के लिए पांच तालिकाओं को जोड़ा गया है। आप मानते हैं कि सभी कर्मचारी व्यक्ति हैं (संगठन नहीं) और यह सहायक दृश्य प्रदान करते हैं:

CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id

और अचानक आपके पास इच्छित डेटा का एक बहुत ही सरल दृश्य है लेकिन एक अत्यधिक लचीले डेटा मॉडल पर।

7. इनपुट का सैनिटाइजेशन नहीं

यह बहुत बड़ा है। अब मुझे PHP पसंद है, लेकिन अगर आप नहीं जानते कि आप क्या कर रहे हैं तो हमला करने के लिए साइटों को बनाना आसान है। कुछ भी नहीं यह छोटे बॉबी टेबल्स की कहानी से बेहतर है ।

उपयोगकर्ता द्वारा URL, फ़ॉर्म डेटा और कुकीज़ के माध्यम से दिए गए डेटा को हमेशा शत्रुतापूर्ण और स्वच्छता के रूप में माना जाना चाहिए। सुनिश्चित करें कि आप वह कर रहे हैं जो आप उम्मीद करते हैं।

8. तैयार कथनों का उपयोग नहीं करना

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

SELECT * FROM users WHERE username = 'bob'

बनाम

SELECT * FROM users WHERE username = ?

या

SELECT * FROM users WHERE username = :username

आपके प्लेटफॉर्म पर निर्भर करता है

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

तैयार किए गए कथनों का उपयोग करने से आपको इस बारे में सार्थक आंकड़े मिलेंगे कि कुछ प्रश्नों का उपयोग कितनी बार किया जाता है।

तैयार किए गए बयान भी SQL इंजेक्शन के हमलों से आपकी रक्षा करेंगे।

9. पर्याप्त सामान्य नहीं

डेटाबेस सामान्यीकरण मूल रूप से डेटाबेस डिजाइन के अनुकूलन की प्रक्रिया है या आप अपने डेटा को तालिकाओं में कैसे व्यवस्थित करते हैं।

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

उपयोगकर्ता आईडी की सूची संग्रहीत करने के लिए यह सर्वोत्तम विधि में आया :

मैंने अन्य प्रणालियों में देखा है कि सूची क्रमबद्ध PHP सरणी में संग्रहीत है।

लेकिन सामान्यीकरण की कमी कई रूपों में आती है।

अधिक:

10. बहुत अधिक सामान्य करना

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

मैंने एक बार एक ऐसी प्रणाली पर काम किया था जिसमें ग्राहकों के लिए एक बहुत बड़ा पदानुक्रम था जो कुछ इस तरह था:

Licensee ->  Dealer Group -> Company -> Practice -> ...

इससे पहले कि आपको कोई सार्थक डेटा मिल सके उससे पहले आपको लगभग 11 तालिकाओं के साथ जुड़ना होगा। यह सामान्यीकरण का बहुत अच्छा उदाहरण था जो बहुत दूर तक ले जाया गया था।

इस बिंदु पर अधिक, सावधान और माना जाता है कि अपभ्रंश से भारी प्रदर्शन लाभ हो सकता है लेकिन ऐसा करते समय आपको वास्तव में सावधान रहना होगा।

अधिक:

11. अनन्य आर्क्स का उपयोग करना

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

से रिलेशनल डेटाबेस डिजाइन ए प्रैक्टिकल गाइड :

हमने जहां भी संभव हो, अनन्य आर्क निर्माण के खिलाफ दृढ़ता से सलाह दी है, इस कारण से कि वे कोड लिखने और अधिक रखरखाव कठिनाइयों को रोकने के लिए अजीब हो सकते हैं।

12. प्रश्नों पर प्रदर्शन विश्लेषण बिल्कुल नहीं करना

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

13. UNION ALL और विशेष रूप से UNION निर्माण पर निर्भरता

SQL शब्दों में एक UNION केवल बधाई डेटा सेट को समेटता है, जिसका अर्थ है कि उनके समान प्रकार और कॉलम की संख्या है। उनके बीच का अंतर यह है कि UNION ALL एक सरल समवशरण है और जहाँ भी संभव हो इसे पसंद किया जाना चाहिए, जबकि UNION नकली डुप्लिकेट को हटाने के लिए DISTINCT करेगा।

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

UNIONs, विशेष रूप से जब जोड़ या आश्रित उपश्रेणियों में उपयोग किया जाता है, एक डेटाबेस को अपंग कर सकता है। जब भी संभव हो उनसे बचने की कोशिश करें।

14. प्रश्नों में OR शर्तों का उपयोग करना

यह हानिरहित लग सकता है। आखिरकार, ANDs ठीक हैं। या ठीक भी होना चाहिए? गलत। मूल रूप से AND स्थिति डेटा सेट को प्रतिबंधित करती है जबकि OR स्थिति इसे बढ़ाती है लेकिन इस तरह से नहीं जो स्वयं को अनुकूलन के लिए उधार देती है। विशेष रूप से जब विभिन्न या शर्तें इस प्रकार परिणाम के लिए DISTINCT ऑपरेशन के लिए प्रभावी रूप से अनुकूलक का उपयोग करने के लिए मजबूर कर सकती हैं।

खराब:

... WHERE a = 2 OR a = 5 OR a = 11

बेहतर:

... WHERE a IN (2, 5, 11)

अब आपका SQL ऑप्टिमाइज़र पहली क्वेरी को प्रभावी रूप से दूसरे में बदल सकता है। लेकिन यह नहीं हो सकता है। बस यह मत करो।

15. अपने डेटा मॉडल को उच्च प्रदर्शन वाले समाधानों के लिए उधार देने के लिए नहीं

यह परिमाण करने के लिए एक कठिन बिंदु है। यह आमतौर पर इसके प्रभाव से मनाया जाता है। यदि आप अपने आप को अपेक्षाकृत सरल कार्यों के लिए स्पष्ट रूप से प्रश्न लिख रहे हैं या अपेक्षाकृत सरल जानकारी खोजने के लिए प्रश्न कुशल नहीं हैं, तो संभवतः आपके पास एक खराब डेटा मॉडल है।

कुछ मायनों में यह बिंदु पहले वाले सभी को सारांशित करता है, लेकिन यह एक सावधानी की कहानी है कि क्वेरी ऑप्टिमाइज़ेशन जैसी चीजें करना अक्सर पहले किया जाता है जब इसे दूसरा किया जाना चाहिए। प्रदर्शन को अनुकूलित करने की कोशिश करने से पहले सबसे पहले और आपको यह सुनिश्चित करना चाहिए कि आपके पास एक अच्छा डेटा मॉडल है। जैसा कि नुथ ने कहा:

सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है

16. डेटाबेस लेनदेन का गलत उपयोग

किसी विशिष्ट प्रक्रिया के लिए सभी डेटा परिवर्तन परमाणु होने चाहिए। यानी यदि ऑपरेशन सफल हो जाता है, तो यह पूरी तरह से करता है। यदि यह विफल रहता है, तो डेटा को अपरिवर्तित छोड़ दिया जाता है। - 'आधे-अधूरे' बदलाव की संभावना नहीं होनी चाहिए।

आदर्श रूप से, इसे प्राप्त करने का सबसे सरल तरीका यह है कि संपूर्ण सिस्टम डिज़ाइन एकल INSERT / UPDATE / DELETE कथनों के माध्यम से सभी डेटा परिवर्तनों का समर्थन करने का प्रयास करे। इस मामले में, किसी विशेष लेनदेन से निपटने की आवश्यकता नहीं है, क्योंकि आपके डेटाबेस इंजन को स्वचालित रूप से ऐसा करना चाहिए।

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

  • पहले कथन से पहले लेन-देन शुरू करें।
  • अंतिम विवरण के बाद लेनदेन करें।
  • किसी भी त्रुटि पर, रोलबैक द ट्रांजैक्शन। और बहुत एनबी! त्रुटि के बाद आने वाले सभी कथनों को छोड़ना / निरस्त करना न भूलें।

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

17. 'सेट-बेस्ड' प्रतिमान को नहीं समझना

SQL भाषा विशिष्ट प्रकार की समस्याओं के अनुकूल एक विशिष्ट प्रतिमान का अनुसरण करती है। विभिन्न विक्रेता-विशिष्ट एक्सटेंशन के बावजूद, भाषा उन समस्याओं से निपटने के लिए संघर्ष करती है जो जावा, सी #, डेल्फी आदि जैसे तुच्छ क्षेत्रों में हैं।

यह समझ की कमी कुछ तरीकों से प्रकट होती है।

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

जिम्मेदारी का स्पष्ट विभाजन निर्धारित करें, और प्रत्येक समस्या को हल करने के लिए उपयुक्त उपकरण का उपयोग करने का प्रयास करें।


9
विदेशी कुंजियों के बारे में MySQL के बयानों पर, आप सही हैं कि MyISAM उनका समर्थन नहीं करता है, लेकिन आप इसका मतलब है कि केवल MyISAM का उपयोग करना खराब डिज़ाइन है। MyISAM का उपयोग करने का एक कारण यह है कि InnoDB FullText खोजों का समर्थन नहीं करता है, और मुझे नहीं लगता कि यह अनुचित है।
डेरेक एच

1
मुझे # 6 के बारे में पूछना है। इस तरह के विचारों का उपयोग करना मेरी पसंदीदा चीजों में से एक है, लेकिन मैंने हाल ही में अपने हॉरर को सीखा, कि अंतर्निहित तालिकाओं पर MySQL अनुक्रमित के साथ ही पालन किया जाता है यदि दृश्य की संरचना मर्ज एल्गोरिथ्म के उपयोग की अनुमति देती है। अन्यथा, एक अस्थायी तालिका का उपयोग किया जाता है और आपके सभी सूचकांक बेकार हैं। जब आप महसूस करते हैं कि यह ऑपरेशन का एक गुच्छा इस व्यवहार का कारण है, तो यह और भी खतरनाक है। यह एक .01 सेकंड क्वेरी को 100 सेकंड में बदलने का एक शानदार तरीका है। क्या यहां किसी और के साथ इसका अनुभव है? मेरी अगली टिप्पणी में लिंक की जाँच करें।
पीटर बैली

5
# 3 से पूरी तरह असहमत हैं। हां, देशों का अस्तित्व समाप्त हो सकता है, लेकिन देश कोड उसी चीज का प्रतिनिधित्व करता रहेगा। मुद्रा कोड या यूएस स्टेट्स के साथ भी। यह इन मामलों में एक सरोगेट कुंजी का उपयोग करने के लिए गूंगा है और आपके प्रश्नों में अधिक उपरि बनाता है क्योंकि आपको एक अतिरिक्त सम्मिलित होना चाहिए। मैं कहूँगा कि यह सुरक्षित है कि आप कहने के लिए शायद चाहिए उपयोगकर्ता-विशिष्ट डेटा (इस प्रकार, नहीं देशों, मुद्राओं और अमेरिका राज्य अमेरिका) के लिए एक किराए का उपयोग करें।
थॉमस

1
रे: # 11 डेटा अखंडता को लागू करने के लिए आवश्यक चेक बाधा तुच्छ है। उस डिज़ाइन से बचने के अन्य कारण हैं, लेकिन "जटिल" चेक बाधा की आवश्यकता उनमें से एक नहीं है।
थॉमस

2
# 3 के साथ आप ईमानदार नहीं हो रहे हैं। कृत्रिम कुंजी की तुलना में अधिक डाउनसाइड हैं "आपको इसकी आवश्यकता नहीं हो सकती है।" विशेष रूप से, एक प्राकृतिक कुंजी का उपयोग करने से आपको उस आदेश को नियंत्रित करने की क्षमता मिलेगी जिसमें आपकी तालिका में डेटा डिस्क पर लिखा गया है। यदि आप जानते हैं कि आपकी तालिका को किस तरह से क्वेरी किया जाएगा, तो आप इसे समवर्ती-एक्सेस की गई पंक्तियों को एक ही पृष्ठ में समाप्त कर सकते हैं। इसके अलावा, आप एक अद्वितीय समग्र सूचकांक का उपयोग करके डेटा अखंडता को लागू कर सकते हैं। यदि आपको इसकी आवश्यकता है, तो आपको इसे अपने कृत्रिम कुंजी सूचकांक के अतिरिक्त जोड़ना होगा। अगर कहा जाए कि कंपोजिट इंडेक्स आपका पेक है तो यह एक पत्थर से मारे गए 2 पक्षी हैं।
शेन एच

110

डेवलपर्स द्वारा किए गए कुंजी डेटाबेस डिज़ाइन और प्रोग्रामिंग गलतियाँ

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

  • असामान्य डेटा का दुरुपयोग करना। अपभ्रंश डेटा को ओवरडोज़ करना और अनुप्रयोग के भीतर इसे बनाए रखने की कोशिश करना डेटा अखंडता मुद्दों के लिए एक नुस्खा है। हर तरह के प्रयोग करें। क्वेरी में शामिल होने के लिए नहीं जोड़ना चाहने वाले के लिए एक बहाना नहीं है।

  • SQL लिखने से डरना। एसक्यूएल रॉकेट विज्ञान नहीं है और वास्तव में अपना काम करने में काफी अच्छा है। ओ / आर मैपिंग परतें 95% क्वेरी करने में काफी अच्छी हैं जो सरल और उस मॉडल में अच्छी तरह से फिट हैं। कभी-कभी SQL काम करने का सबसे अच्छा तरीका है।

  • डॉगमैटिक 'नो स्टोर्ड प्रोसीजर' की नीतियां। भले ही आप मानते हैं कि संग्रहीत प्रक्रियाएं बुराई हैं, इस तरह के हठधर्मिता रवैये का सॉफ़्टवेयर प्रोजेक्ट पर कोई स्थान नहीं है।

  • डेटाबेस डिज़ाइन को नहीं समझना। सामान्यीकरण आपका मित्र है और यह रॉकेट साइंस नहीं है। जॉइनिंग और कार्डिनैलिटी काफी सरल अवधारणाएं हैं - यदि आप डेटाबेस एप्लिकेशन डेवलपमेंट में शामिल हैं, तो उन्हें न समझने के लिए वास्तव में कोई बहाना नहीं है।


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

ईटीएल को लिखने वाले गरीबों को नहीं - सिस्टम से डेटा का उपयोग करने वाला कोई भी व्यक्ति, एमआईएस एप्लिकेशन में खराब गुणवत्ता वाला डेटा, क्योंकि इसमें कई महत्वपूर्ण रिश्ते वास्तव में स्रोत पर दर्ज नहीं किए गए हैं, अंतहीन सुलह-समझौते में शामिल किसी को भी - खराब डेटा गुणवत्ता से।
कंसर्नडऑफटुनब्रिजवल्स 23

मैं संभवतः बिंदु एक से अधिक असहमत नहीं हो सकता था। डेटाबेस दृढ़ता के लिए हैं, वे अंतर-प्रक्रिया संचार के लिए नहीं हैं। उस समस्या के लगभग हमेशा बेहतर समाधान हैं। जब तक इसके लिए एक स्पष्ट आवश्यकता नहीं है, आप बिल्कुल डेटाबेस का इलाज करेंगे जैसे कि आपके आवेदन के अलावा कोई भी कभी भी इसका उपयोग नहीं करेगा। यहां तक ​​कि अगर एक स्पष्ट आवश्यकता है, तो उस पर कुछ उपयोगकर्ता कहानी और मूल कारण विश्लेषण करें और आप अक्सर अनुरोधकर्ता के इरादे को पूरा करने का एक बेहतर तरीका खोज लेंगे। फिर से, मैं एक कंपनी में काम करता हूँ जहाँ वाक्यांश CQRS कुछ सामान्य है
जॉर्ज मौअर

3
तुच्छ उदाहरण: मेरे पास एक बीमा पॉलिसी प्रशासन प्रणाली है और संभावित पुनर्प्राप्ति की गणना करने के लिए एक सीडेड पुनर्बीमा प्रणाली में 5 मिलियन दावों की स्थिति को लोड करने की आवश्यकता है। सिस्टम पुराने क्लाइंट-सर्वर COTS पैकेज हैं, जो कि पुराने मेनफ्रेम सिस्टम को इंटरफेस करने के लिए डिज़ाइन किए गए हैं। दोनों को वित्तीय नियंत्रण उद्देश्यों के लिए सामंजस्य स्थापित करना होगा। यह काम प्रति माह एक बार किया जाता है। आपके तर्क से मैं आवश्यकताओं को परिभाषित करने वाली उपयोगकर्ता कहानियों की एक श्रृंखला लिखूंगा और विक्रेताओं को अपने मौजूदा उत्पादों में एक वेब सेवा आवरण जोड़ने के लिए बोली लगाने के लिए कहूंगा।
ConcernedOfTunbridgeWells

2
फिर आपका डीबीए या तो आलसी या अक्षम है।
कंसर्नडऑफटुनब्रिजवेल्स

80
  1. डेटाबेस स्कीमा पर संस्करण नियंत्रण का उपयोग नहीं करना
  2. लाइव डेटाबेस के खिलाफ सीधे काम करना
  3. अधिक उन्नत डेटाबेस अवधारणाओं (इंडेक्स, क्लस्टर इंडेक्स, बाधाएं, भौतिक विचार आदि) को पढ़ना और समझना नहीं
  4. स्केलेबिलिटी के लिए परीक्षण करने में विफल ... केवल 3 या 4 पंक्तियों का परीक्षण डेटा आपको वास्तविक लाइव प्रदर्शन की वास्तविक तस्वीर कभी नहीं देगा

1
मैं दूसरा, भारी, # 1 और # 2। कभी भी मैं DB के लिए एक परिवर्तन कर देता हूँ, मैं उसके स्कीमा को डंप कर देता हूँ और उसे संस्करणित करता हूँ; मेरे पास तीन डेटाबेस सेटअप हैं, एक देव एक, एक मंचन और एक जीवित एक - कुछ भी नहीं रहने वाले DB पर "परीक्षण" किया जाता है !!
Ixmatus

यहां रेड गेट पर हमने एसक्यूएल सोर्स कंट्रोल के साथ अपने पहले बिंदु को बेहतर बनाने के लिए कदम उठाए हैं! अपने शोध के दौरान मेरे द्वारा की गई बातचीत से मुझे लगता है कि लोग अब उत्पादन डेटाबेस के खिलाफ विकसित नहीं हो रहे हैं, लेकिन अक्सर "आपातकालीन" सुधार किए जाते हैं जो आम तौर पर विकास के वातावरण में वापस आते हैं, जो एक और मुद्दा है।
डेविड एटकिन्सन

46

संग्रहीत प्रक्रियाओं पर अधिक उपयोग और / या निर्भरता।

कुछ एप्लिकेशन डेवलपर्स संग्रहीत प्रक्रियाओं को मध्य स्तरीय / फ्रंट एंड कोड के प्रत्यक्ष विस्तार के रूप में देखते हैं। यह Microsoft स्टैक डेवलपर्स में एक सामान्य लक्षण प्रतीत होता है, (मैं एक हूं, लेकिन मैं इससे बाहर हो गया हूं) और कई संग्रहीत कार्यविधियों का निर्माण करता है जो जटिल व्यावसायिक तर्क और वर्कफ़्लो प्रसंस्करण करते हैं। यह कहीं और बेहतर है।

संग्रहीत प्रक्रियाएं उपयोगी हैं जहां यह वास्तव में साबित हो गया है कि कुछ वास्तविक तकनीकी कारक उनके उपयोग (उदाहरण के लिए, प्रदर्शन और सुरक्षा) की आवश्यकता है उदाहरण के लिए, बड़े डेटा सेटों को "डेटा के करीब" एकत्र करना / फ़िल्टर करना।

मुझे हाल ही में एक बड़े डेल्फी डेस्कटॉप एप्लिकेशन को बनाए रखने और बढ़ाने में मदद करनी थी, जिसमें 70% व्यापार तर्क और नियम 1400 SQL सर्वर संग्रहीत प्रक्रियाओं (UI इवेंट हैंडलर में शेष) में लागू किए गए थे। यह एक बुरा सपना था, मुख्य रूप से TSQL के लिए प्रभावी इकाई परीक्षण शुरू करने के अंतर के कारण, इनकैप्सुलेशन की कमी और खराब उपकरण (डीबगर्स, संपादक)।

अतीत में एक जावा टीम के साथ काम करने से मुझे जल्दी से पता चला कि अक्सर उस वातावरण में पूर्ण विपरीत पकड़ होती है। एक जावा वास्तुकार ने एक बार मुझसे कहा था: "डेटाबेस डेटा के लिए है, कोड नहीं।"

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


4
संग्रहीत प्रक्रियाएं किसी भी परियोजना में चोट लगने का एक द्वीप बन जाती हैं जहां उनका उपयोग किया जाता है, इस प्रकार कुछ डेवलपर्स एक नियम बनाते हैं "कोई संग्रहीत प्रक्रिया नहीं"। तो ऐसा लगता है कि वहाँ एक खुला संघर्ष उन्हें धोखा दे रहा है। आपका उत्तर वास्तव में एक रास्ता, या दूसरे को चुनने के लिए एक अच्छा मामला बनाता है।
वॉरेन पी

लाभ: सुरक्षा - आपको अनुप्रयोगों को "से हटाने के लिए ..." की क्षमता देने की आवश्यकता नहीं है; tweaks - डीबीए पूरे आवेदन को फिर से शुरू / तैनात करने के बिना प्रश्नों को मोड़ सकता है; विश्लेषण - यह सुनिश्चित करने के लिए कि वे अभी भी मान्य हैं, डेटा मॉडल में बदलाव के बाद प्रोक्स का एक गुच्छा फिर से इकट्ठा करना आसान है; और, अंत में, SQL को डेटाबेस इंजन (आपके एप्लिकेशन द्वारा नहीं) द्वारा निष्पादित किया जाता है, फिर "डेटाबेस डेटा के लिए है, कोड नहीं" की अवधारणा केवल मंद है।
NotMe

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

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

@too: ज्यादातर मामलों में डेटाबेस बदलना बहुत महंगा है। प्रदर्शन और सुरक्षा सुविधाओं को खोने के विचार के बारे में कोई विशेष डीबीएमएस प्रदान नहीं करता है। इसके अलावा, अतिरिक्त स्तरों में जटिलता और प्रदर्शन में कमी आती है और अतिरिक्त परतें आपकी विशेष भाषा से जुड़ी होती हैं। अंत में, यह अधिक संभावना है कि उपयोग की जा रही भाषा डेटाबेस सर्वर से बदल जाएगी।
NotMe

41

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


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

मैं कहूंगा कि डेटाबेस का आकार लोड की तुलना में बड़ा मुद्दा है। मैंने कई बार देखा है, कि महत्वपूर्ण अनुक्रमणिकाएँ गायब थीं - परीक्षणों के दौरान प्रदर्शन समस्या कभी नहीं हुई, क्योंकि पूरा डेटाबेस स्मृति में फिट है
डेन्यूबियन नाविक


28

खराब प्रदर्शनों के कारण खराब प्रदर्शन

अधिकांश समय आप सहसंबंधित उप-श्रेणियों से बचना चाहते हैं। एक सबक्वेरी को सहसंबंधित किया जाता है, यदि सबक्वेरी के भीतर, बाहरी क्वेरी से एक कॉलम का संदर्भ होता है। जब ऐसा होता है, तो हर पंक्ति के लिए कम से कम एक बार सबक्वेरी को निष्पादित किया जाता है और अधिक बार निष्पादित किया जा सकता है यदि अन्य शर्तें लागू की जाती हैं, तो सहसंबद्ध उपश्रेणी वाली स्थिति लागू होने के बाद।

आकस्मिक उदाहरण और ओरेकल सिंटैक्स को माफ़ कर दें, लेकिन मान लें कि आप उन सभी कर्मचारियों को ढूंढना चाहते हैं जिन्हें आपके किसी भी स्टोर में रखा गया है क्योंकि पिछली बार स्टोर ने एक दिन में $ 10,000 से कम बिक्री की थी।

select e.first_name, e.last_name
from employee e
where e.start_date > 
        (select max(ds.transaction_date)
         from daily_sales ds
         where ds.store_id = e.store_id and
               ds.total < 10000)

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

select e.first_name, e.last_name
from employee e,
     (select ds.store_id,
             max(s.transaction_date) transaction_date
      from daily_sales ds
      where ds.total < 10000
      group by s.store_id) dsx
where e.store_id = dsx.store_id and
      e.start_date > dsx.transaction_date

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

मैंने देखा है कि कनिष्ठ डेवलपर्स ने कई बार उपश्रेणियों को सहसंबद्ध किया है और इसका आमतौर पर प्रदर्शन पर गंभीर प्रभाव पड़ा है। हालाँकि, जब एक सहसंबद्ध उपकुंजी को हटाते हैं तो यह सुनिश्चित करने से पहले और बाद में स्पष्ट करें कि आप प्रदर्शन को बदतर नहीं बना रहे हैं।


1
महान बिंदु, और अपने संबंधित बिंदुओं में से एक पर जोर देने के लिए - अपने परिवर्तनों का परीक्षण करें। व्याख्या योजनाओं का उपयोग करना सीखें (और देखें कि डेटाबेस वास्तव में आपकी क्वेरी को निष्पादित करने के लिए क्या कर रहा है, और इसकी लागत क्या है), एक बड़े डेटासेट पर अपने परीक्षण करें, और एक अनुकूलन के लिए अपने SQL को अधिक जटिल और अपठनीय / अप्राप्य न बनाएं। यह वास्तव में वास्तविक प्रदर्शन में सुधार नहीं करता है।
रॉब व्हेलन

21

मेरे अनुभव में:
अनुभवी डीबीए के साथ संवाद नहीं।


17

"वास्तविक" डेटाबेस के बजाय एक्सेस का उपयोग करना। SQL Express , MySQL और SQLite जैसे बहुत सारे छोटे छोटे और यहां तक ​​कि मुफ्त डेटाबेस हैं जो काम करेंगे और बेहतर तरीके से स्केल करेंगे। ऐप्स को अक्सर अप्रत्याशित तरीकों से स्केल करने की आवश्यकता होती है।


16

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


14

भंडारण (भारी मात्रा में) डेटा के लिए एक्सेल का उपयोग करना।

मैंने कंपनियों को हजारों पंक्तियों को पकड़कर और कई कार्यपत्रकों का उपयोग करते हुए (एक्सेल के पिछले संस्करणों पर 65535 की पंक्ति सीमा के कारण) देखा है।


एक्सेल रिपोर्ट, डेटा प्रस्तुति और अन्य कार्यों के लिए अच्छी तरह से अनुकूल है, लेकिन इसे डेटाबेस के रूप में नहीं माना जाना चाहिए।


14

मैं जोड़ना चाहूंगा: अत्यधिक प्रदर्शन करने वाले कोड पर "सुरुचिपूर्ण" कोड के अनुकूल। डेटाबेस के खिलाफ सबसे अच्छा काम करने वाला कोड अक्सर एप्लिकेशन डेवलपर की आंखों में बदसूरत होता है।

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


2
+1 - डेटाबेस प्रोग्रामिंग में यांत्रिक घटकों के व्यवहार को अनुकूलित करना शामिल है। ध्यान दें, हालांकि, नूथ कहता है कि समय से पहले अनुकूलन 97% समय (या उस प्रभाव के लिए शब्द) के बारे में सभी बुराई की जड़ है। डेटाबेस डिजाइन एक ऐसा क्षेत्र है जहां आपको वास्तव में इस अप फ्रंट के बारे में सोचना है।
कंसर्नडऑफटुनब्रिजवेल्स

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

13

पैरामीटर किए गए प्रश्नों का उपयोग नहीं करना। वे SQL इंजेक्शन को रोकने में बहुत आसान हैं ।

यह एक अन्य उत्तर में उल्लिखित इनपुट डेटा को साफ नहीं करने का एक विशिष्ट उदाहरण है।


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

12

जब डेवलपर्स नेस्टेड स्टेटमेंट्स का उपयोग करते हैं या यहां तक ​​कि किसी क्वेरी के "सेलेक्ट" हिस्से के अंदर एक चुनिंदा स्टेटमेंट के परिणाम का भी उपयोग करते हैं तो मुझे इससे नफरत है।

मुझे वास्तव में आश्चर्य है कि मैं इसे कहीं और नहीं देखता, शायद मैंने इसे अनदेखा कर दिया, हालांकि @adam में इसी तरह का मुद्दा है।

उदाहरण:

SELECT
    (SELECT TOP 1 SomeValue FROM SomeTable WHERE SomeDate = c.Date ORDER BY SomeValue desc) As FirstVal
    ,(SELECT OtherValue FROM SomeOtherTable WHERE SomeOtherCriteria = c.Criteria) As SecondVal
FROM
    MyTable c

इस परिदृश्य में, यदि MyTable 10000 पंक्तियों को लौटाता है, तो ऐसा होता है जैसे कि क्वेरी सिर्फ 20001 क्वेरी को चलाता है, क्योंकि उसे परिणाम की प्रत्येक पंक्ति के लिए प्रारंभिक क्वेरी प्लस क्वेरी को प्रत्येक तालिका के एक बार चलाना था।

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

एक बेहतर (जरूरी नहीं कि सही) उदाहरण कुछ इस तरह हो:

SELECT
     s.SomeValue As FirstVal
    ,o.OtherValue As SecondVal
FROM
    MyTable c
    LEFT JOIN (
        SELECT SomeDate, MAX(SomeValue) as SomeValue
        FROM SomeTable 
        GROUP BY SomeDate
     ) s ON c.Date = s.SomeDate
    LEFT JOIN SomeOtherTable o ON c.Criteria = o.SomeOtherCriteria

यह डेटाबेस ऑप्टिमाइज़र को मुख्य तालिका से प्रत्येक रिकॉर्ड पर आवश्यकता के बजाय डेटा को एक साथ फेरबदल करने की अनुमति देता है, और मुझे आमतौर पर लगता है कि मुझे कोड को ठीक करना होगा जहां यह समस्या बनाई गई है, मैं आमतौर पर प्रश्नों की गति 100% बढ़ाता हूं या सीपीयू और मेमोरी उपयोग को कम करते हुए एक साथ अधिक।


12

SQL- आधारित डेटाबेस के लिए:

  1. CLUSTERED INDEXES का लाभ न लेना या CLUSTER के लिए गलत कॉलम का चयन करना।
  2. माता-पिता / बच्चे की तालिका संबंध में एक प्रमुख कुंजी (INT) में शामिल होने के लिए एक प्रमुख कुंजी के रूप में एक सीरियल (ऑटोनम्बर) डेटाटाइप का उपयोग नहीं करना।
  3. कई अभिलेखों को नष्ट कर दिया या हटा दिया गया है जब एक मेज पर अद्यतन सांख्यिकी नहीं।
  4. पुनर्गठन नहीं किया जाता है (यानी अनलोडिंग, ड्रॉपिंग, री-क्रिएट, लोडिंग और री-इंडेक्सिंग) टेबल जब कई पंक्तियों को डाला या हटा दिया गया है (कुछ इंजन भौतिक रूप से हटाए गए झंडे के साथ तालिका में हटाए गए पंक्तियों को रखते हैं।)
  5. बड़े तालिकाओं पर लेन-देन (यदि समर्थित है) पर लाभ का लाभ न उठाना, जिसमें उच्च लेनदेन दर है।
  6. एक कॉलम के लिए गलत डेटाटाइप चुनना!
  7. उचित कॉलम नाम का चयन नहीं करना।
  8. तालिका के अंत में नए कॉलम नहीं जोड़ना।
  9. अक्सर इस्तेमाल किए जाने वाले प्रश्नों का समर्थन करने के लिए उचित इंडेक्स नहीं बनाना।
  10. कुछ संभावित मानों वाले स्तंभों पर अनुक्रमणिका बनाना और अनावश्यक अनुक्रमणिका बनाना।
    ... और जोड़ा जाएगा।

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

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

@ डेविड: मैं सही हूं! .. प्राथमिक कुंजी के रूप में ऑटोनम्बर का उपयोग करना आवश्यक नहीं है, फिर भी माता-पिता में एक अनुक्रमित सीरियल कॉलम हो सकता है, संबंध की गारंटी देने के लिए बच्चे को सरोगेट में शामिल करना गंभीर नहीं होगा, जबकि दूसरा पंक्ति का पता लगाने के लिए एक सार्थक प्राथमिक के रूप में कॉलम!
फ्रैंक आर।

यह शब्दार्थ का एक मुद्दा है, दिन के अंत में ... और Microsoft प्राथमिक कुंजी को अर्थपूर्ण होने के बजाय अर्थहीन होना पसंद करता है। चारों ओर बहस इस पर क्रोध करती है, लेकिन मैं "सार्थक" शिविर में आता हूं। :)
डेविड टी। मैकनेट

9
  • उत्पादन डेटाबेस के अंदर कुछ समस्या को ठीक करने से पहले बैकअप नहीं लेना।

  • संग्रहीत कार्यविधियों में संग्रहीत ऑब्जेक्ट्स (जैसे टेबल, विचार) पर DDL कमांड का उपयोग करना।

  • जहाँ भी अधिक कुशल / उपयोग करने के लिए उपयुक्त हो, संग्रहीत खरीद या उपयोग करने के डर से ORM प्रश्नों का उपयोग करने का डर।

  • एक डेटाबेस प्रोफाइलर के उपयोग को अनदेखा करना, जो आपको यह बता सकता है कि आपकी ORM क्वेरी को आखिरकार किस रूप में परिवर्तित किया जा रहा है और इसलिए ORM का उपयोग न करने पर तर्क या डीबगिंग के लिए भी इसे सत्यापित करें।


8

सामान्यीकरण का सही स्तर न करना । आप यह सुनिश्चित करना चाहते हैं कि डेटा डुप्लिकेट नहीं है, और आप डेटा को आवश्यकतानुसार अलग कर रहे हैं। आपको यह भी सुनिश्चित करने की आवश्यकता है कि आप सामान्यीकरण का बहुत दूर तक पालन ​​नहीं कर रहे हैं क्योंकि इससे प्रदर्शन को नुकसान होगा।


कितनी दूर बहुत दूर है? यदि कोई डेटा डुप्लिकेट नहीं है, तो आप इसे आगे कैसे ले जा सकते हैं?
फिन मार्व 7'09

सामान्यीकरण निरर्थक डेटा को हटाने और लचीलेपन में वृद्धि बनाम घटे हुए प्रदर्शन और बढ़ी हुई जटिलता का संतुलन है। सही संतुलन खोजने से अनुभव होता है और यह समय के साथ बदलता है। देखें en.wikipedia.org/wiki/Database_normalization जानकारी के लिए जब denormalize करने पर
नाथन Voxland

8

डेटाबेस को सिर्फ स्टोरेज मैकेनिज्म (यानी ग्लोरीफाइड कलेक्शन लाइब्रेरी) के रूप में मानना ​​और इसलिए उनके एप्लिकेशन को अधीनस्थ करना (अन्य एप्लिकेशन को अनदेखा करना जो डेटा साझा करते हैं)


यह करने के लिए एक corollary अनुप्रयोग में बहुत अधिक क्वेरी काम करने के लिए इसे db में रखने के बजाय जहाँ यह है से उतारना है। LINQ इस बारे में विशेष रूप से बुरा है।
डीवेव

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

8

1 - अनावश्यक रूप से एक फ़ंक्शन का उपयोग उस मूल्य पर जहां खंड में उस सूचकांक के परिणाम का उपयोग नहीं किया जा रहा है।

उदाहरण:

where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate

के बजाय

where someDate >= to_date(:fromDate,'YYYYMMDD') and someDate < to_date(:toDate,'YYYYMMDD')+1

और कुछ हद तक: उन मूल्यों के लिए कार्यात्मक अनुक्रमित नहीं जोड़ना, जिनकी उन्हें आवश्यकता है ...

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

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

इसके बारे में सोचो, डेटा के बिना एक तालिका को फिर से डिज़ाइन करना बहुत सस्ता है। कोई अखंडता के साथ लाखों रिकॉर्ड के साथ एक तालिका ... इतना सस्ता करने के लिए सस्ता नहीं है। इस प्रकार, कॉलम या टेबल बनाते समय सही डिजाइन करना, हुकुम में परिशोधन है।

4 - प्रति से डेटाबेस के बारे में इतना नहीं है, लेकिन वास्तव में कष्टप्रद है। SQL की कोड गुणवत्ता के बारे में परवाह नहीं है। तथ्य यह है कि आपके एसक्यूएल को पाठ में व्यक्त किया गया है, यह स्ट्रिंग हेरफेर एल्गोरिदम के ढेर में तर्क को छिपाने के लिए ठीक नहीं है। एसक्यूएल को टेक्स्ट में इस तरीके से लिखना पूरी तरह से संभव है जो वास्तव में आपके साथी प्रोग्रामर द्वारा पढ़ा जा सके।


7

यह पहले कहा गया है, लेकिन: अनुक्रमित, अनुक्रमित, अनुक्रमित । मैंने खराब प्रदर्शन करने वाले एंटरप्राइज़ वेब ऐप के बहुत सारे मामले देखे हैं, जो कि केवल थोड़ी सी प्रोफाइलिंग करके तय किए गए थे (यह देखने के लिए कि कौन सी टेबल बहुत हिट हो रही हैं), और फिर उन टेबलों पर एक इंडेक्स जोड़ दिया। यह SQL लेखन ज्ञान के रास्ते में ज्यादा की आवश्यकता नहीं है, और अदायगी बहुत बड़ी है।

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

और अंत में: एक स्पष्ट, सुसंगत, सहज नामकरण सम्मेलन का उपयोग करें। उसी तरह से कि एक अच्छी तरह से लिखा हुआ कोड पठनीय होना चाहिए, एक अच्छा एसक्यूएल स्कीमा या क्वेरी पठनीय होना चाहिए और व्यावहारिक रूप से आपको यह बताना चाहिए कि यह क्या कर रहा है, यहां तक ​​कि टिप्पणियों के बिना भी। आप छह महीने में खुद को धन्यवाद देंगे, जब आपको तालिकाओं पर रखरखाव करना होगा। "SELECT account_number, billing_date FROM national_accounts""SELECT ACCNTNBR, BILLDAT FROM NTNLACCS" की तुलना में काम करना आसान है।


यदि आप उन्हें सही ढंग से सेट करते हैं तो वे नहीं करेंगे लेकिन इसमें ट्रिगर्स का उपयोग शामिल है जिससे बहुत से लोगों को एलर्जी है।
एचएलजीईएम

6

DELETE क्वेरी (विशेष रूप से उत्पादन डेटाबेस पर) चलाने से पहले संबंधित चयन क्वेरी को निष्पादित नहीं करना!


5

बीस साल में सबसे आम गलती मैंने देखी है: आगे की योजना नहीं। कई डेवलपर्स डेटाबेस बनाएंगे, और टेबल, और फिर लगातार तालिकाओं को संशोधित और विस्तारित करेंगे क्योंकि वे अनुप्रयोगों का निर्माण करते हैं। अंतिम परिणाम अक्सर गड़बड़ी और अक्षम और बाद में साफ या सरल बनाने में मुश्किल होता है।


1
मैं इन स्थितियों में होने वाली भयावहता की कल्पना कर सकता हूं ... तेजी से प्रोटोटाइप और पुनरावृत्ति के विकास के लिए स्कीमलेस डेटाबेस बहुत बेहतर हैं, लेकिन बाकी सभी चीजों की तरह, इस तरह के लचीलेपन के साथ विभिन्न व्यापार बंद हो जाते हैं।
ज़ोल्सट टॉरक

4

क) स्ट्रिंग
बी में हार्डकॉन्डिंग क्वेरी मान ) डेटाबेस फॉर्म कोड को "ऑनबॉटनप्रेस" कार्रवाई में एक विंडोज फॉर्म एप्लीकेशन में डाल देना

मैंने दोनों को देखा है।


4
"On प्रपत्र में" OnButtonPress "कार्रवाई में DB क्वेरी कोड डालना" डेटाबेस की गलती यहाँ क्या है?
पुनरावर्ती

@recursive: यह एक विशाल एसक्यूएल इंजेक्शन भेद्यता है। कोई भी आपके सर्वर पर मनमाना SQL भेज सकता है और इसे वर्बेटिम चलाया जाएगा।
बिल कार्विन

@Recursive से सहमत हैं। इनका वास्तव में डीबी मुद्दों से कोई लेना-देना नहीं है।
p.campbell

b) आर्किटेक्चर की गलती है। बेशक, आपके ऐप में सीधे प्रश्नों को कोड करना एक बुरा विचार है।
डीवेव

4

अपने आवेदन में डेटाबेस कनेक्शन के प्रबंधन की ओर पर्याप्त ध्यान नहीं दे रहा है। फिर आपको एप्लिकेशन, कंप्यूटर, सर्वर और नेटवर्क का पता चलता है।


4
  1. यह सोचकर कि वे डीबीए और डेटा मॉडलर / डिज़ाइनर हैं, जब उनके पास उन क्षेत्रों में किसी भी प्रकार का कोई औपचारिक घर नहीं है।

  2. यह सोचकर कि उनके प्रोजेक्ट को डीबीए की आवश्यकता नहीं है क्योंकि वह सामान सभी आसान / तुच्छ है।

  3. डेटाबेस में किए जाने वाले कार्य और ऐप में किए जाने वाले कार्य के बीच उचित रूप से विचार करने में विफलता।

  4. बैकअप मान्य नहीं है, या बैकअप नहीं है।

  5. अपने कोड में कच्ची SQL एम्बेड करना।



3

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


3

समझ में नहीं आता है कि कैसे एक DBMS हुड के तहत काम करता है।

क्लच कैसे काम करता है, यह समझे बिना आप स्टिक को ठीक से नहीं चला सकते। और आप समझ नहीं सकते हैं कि डेटाबेस का उपयोग कैसे करें, यह समझे बिना कि आप वास्तव में अपनी हार्ड डिस्क पर एक फ़ाइल में लिख रहे हैं।

विशेष रूप से:

  1. क्या आप जानते हैं कि क्लस्टर इंडेक्स क्या है? क्या आपने इसके बारे में सोचा जब आपने अपना स्कीमा डिज़ाइन किया था?

  2. क्या आप जानते हैं कि इंडेक्स का सही इस्तेमाल कैसे करें? सूचकांक का पुन: उपयोग कैसे करें? क्या आप जानते हैं कि एक आवरण सूचकांक क्या है?

  3. इतना बढ़िया, आपके पास अनुक्रमित है। आपके सूचकांक में 1 पंक्ति कितनी बड़ी है? जब आपके पास बहुत सारा डेटा होगा तो इंडेक्स कितना बड़ा होगा? कि स्मृति में आसानी से फिट होगा? यदि यह एक सूचकांक के रूप में बेकार नहीं होगा।

  4. क्या आपने कभी MySQL में EXPLAIN का उपयोग किया है? महान। अब अपने आप से ईमानदार रहें: क्या आपने जो देखा, उसका आधा हिस्सा भी आपको समझ में आया? नहीं, आपने शायद नहीं किया। उसे फिक्स करें।

  5. क्या आप क्वेरी कैश को समझते हैं? क्या आप जानते हैं कि एक क्वेरी अन-कैचबल क्या है?

  6. क्या आप MyISAM का उपयोग कर रहे हैं? यदि आपको पूर्ण पाठ खोज की आवश्यकता है, तो MyISAM का उपयोग बकवास है। स्फिंक्स का प्रयोग करें। फिर इनो पर स्विच करें।


2
एक बेहतर सादृश्य यह हो सकता है कि कोई क्लच को समझे बिना मैन्युअल ट्रांसमिशन का ठीक से निवारण न कर सके । एक क्लच कैसे काम करता है, यह जाने बिना बहुत से लोग स्टिक-शिफ्ट ठीक से चलाते हैं।
माइकल ईस्टर

3
  1. बल्क अपडेट करने के लिए ORM का उपयोग करना
  2. आवश्यकता से अधिक डेटा का चयन करना। फिर से, आमतौर पर ORM का उपयोग करते समय किया जाता है
  3. एक लूप में फायरिंग वर्ग।
  4. केवल लाइव डेटा पर अच्छे परीक्षण डेटा और सूचना प्रदर्शन में गिरावट नहीं होना।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.