7

मैं सीजे तिथि के SQL and Relational Theory: How to Write Accurate SQL Code पढ़ रहा हूँ, और वह मामले कि स्थितीय क्वेरी दी गई हैं, उदाहरण के लिए बुरा —, इस INSERT बनाता है: इसके बजायस्थितिगत प्रश्न क्यों खराब हैं?

INSERT INTO t VALUES (1, 2, 3) 

, तो आप इस तरह विशेषता आधारित प्रश्नों का उपयोग करना चाहिए:

INSERT INTO t (one, two, three) VALUES (1, 2, 3) 

अब, मैं समझता हूं कि पहली क्वेरी संबंधपरक मॉडल के अनुरूप है क्योंकि टुपल्स (पंक्तियां) गुणों (कॉलम) के अनियमित सेट हैं। मुझे समझ में समस्या हो रही है कि पहली क्वेरी में नुकसान कहां है। क्या कोई मुझे ये समझा सकता है?

उत्तर

20

पहली क्वेरी टेबल स्कीमा में किसी भी समय बदल जाती है। दूसरी क्वेरी किसी भी स्कीमा परिवर्तन को समायोजित करती है जो इसके कॉलम को बरकरार रखती है और डिफ़ॉल्ट रहित कॉलम नहीं जोड़ती है।

लोग जो SELECT * प्रश्न करते हैं और फिर उन कारणों को निकालने के लिए स्थितित्मक नोटेशन पर भरोसा करते हैं, जिनके बारे में वे चिंतित हैं software maintenance supervillains इसी कारण से।

+1

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

5

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

+0

हालांकि, कोई भी जो इस बात से अनजान है कि पहली क्वेरी मौजूद है, पहले दो के मध्य में एक क्वेरी जोड़ सकती है, और क्वेरी को गड़बड़ कर सकती है। – Kibbee

+1

@ किबीबी: ... और यही कारण है कि यह अस्तित्व में नहीं होना चाहिए। –

+0

क्षमा करें, ऐसा लगता है कि मैंने पहली बार आपकी प्रतिक्रिया को गलत तरीके से पढ़ा था। – Kibbee

9

कॉलम के क्रम है स्कीमा में निर्धारित है, यह आम तौर पर नहीं के रूप में महत्वपूर्ण है क्योंकि यह धारणात्मक नहीं है महत्वपूर्ण माना जाना चाहिए है।

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

2

आपको अपने एसक्यूएल प्रश्नों को यथासंभव कम से कम तालिका के सटीक लेआउट पर निर्भर करने की कोशिश करनी चाहिए।

पहली क्वेरी तालिका में केवल तीन फ़ील्ड हैं, और उस सटीक क्रम में निर्भर करती है। तालिका में कोई भी बदलाव क्वेरी को तोड़ देगा।

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

हालांकि आप तालिका लेआउट को अक्सर पुनर्व्यवस्थित नहीं करते हैं, फिर भी तालिका में अधिक फ़ील्ड जोड़ना काफी आम है।

इसके अलावा, दूसरी क्वेरी अधिक पठनीय है। आप खुद से क्वेरी से बता सकते हैं कि रिकॉर्ड में क्या मूल्य डालते हैं।

1

एसक्यूएल आपको INSERT और SELECT कथन दोनों के लिए कॉलम का नाम निर्दिष्ट करने के लिए वाक्यविन्यास देता है। आपको इसका उपयोग करना चाहिए क्योंकि:

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

    INSERT t SET one = 1 , two = 2 , three = 3 
    

    कौन सा दूर पढ़ सकते हैं और दोनों उदाहरणों से बनाए रखने के लिए आसान है:

1

मैं अद्यतन की तरह सिंटैक्स का उपयोग करना पसंद करते हैं।

+0

मुझे विश्वास नहीं है कि यह क्रॉस-प्लेटफार्म है - कम से कम, टी-एसक्यूएल इसका समर्थन नहीं कर रहा है। –

+0

टी-एसक्यूएल का उपयोग न करने का एक अन्य कारण। ;) ऐसा लगता है कि यह मुख्य रूप से एक MySQL एक्सटेंशन है। यह एक दयालु अन्य डीबीएमएस ने इसके लिए समर्थन नहीं जोड़ा है। –

+1

भाषा विकास काफी धीमा है, खासकर उन भाषाओं के लिए जो एसक्यूएल की तरह थोड़ी देर के लिए आसपास रहे हैं। यह बहुत बुरा है, मुझे आपका उदाहरण पसंद है। –

1

दीर्घकालिक, यदि आप अपनी तालिका में एक और कॉलम जोड़ते हैं, तो आपका INSERT तब तक काम नहीं करेगा जब तक आप स्पष्ट रूप से कॉलम की सूची निर्दिष्ट नहीं करते। अगर कोई कॉलम के क्रम को बदलता है, तो आपका आईएनएसईआरटी चुपचाप गलत कॉलम में मान डालने में सफल हो सकता है।

2

कुछ ऐसा जो अभी तक उल्लेख नहीं किया गया है वह यह है कि आपके पास मूल्य को असाइन करने के लिए auto_increment (या कुछ समान) के साथ अक्सर आपके पीके के रूप में सरोगेट कुंजी होगी। पहले के साथ, आपको कुछ निर्दिष्ट करना होगा — लेकिन यदि इसका उपयोग नहीं किया जाता है तो आप किस मूल्य को निर्दिष्ट कर सकते हैं? NULL एक विकल्प हो सकता है, लेकिन यह वास्तव में पीके को NOT NULL पर सेट करने के लिए उपयुक्त नहीं है।

लेकिन इसके अलावा, "एक विशिष्ट स्कीमा पर बंद" पूरी तरह से एक महत्वपूर्ण कारण है, आईएमओ।

0

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

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