हाँ यह एक भयानक विचार है।
जाने के बजाय:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
अब आपको जाना है:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
फिर आपको अपने कॉम्प्लेक्स कोड को अलग-अलग संख्याओं में विभाजित करने के लिए अपने एप्लिकेशन कोड में सामान करने की आवश्यकता है, फिर डेटाबेस को अलग-अलग क्वेरी करें:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
यह डिजाइन एंटीपैटर या तो संबंधपरक मॉडलिंग की पूरी गलतफहमी से उपजा है (आपको तालिकाओं से डरने की ज़रूरत नहीं है। टेबल्स आपके मित्र हैं। उनका उपयोग करें), या एक विचित्र रूप से गलत धारणा यह अल्पविराम से अलग की गई सूची लेने और इसे विभाजित करने के लिए तेज़ है। एप्लिकेशन कोड में लिंक टेबल को जोड़ना है (यह कभी नहीं है)। तीसरा विकल्प यह है कि वे विदेशी चाबियों को स्थापित करने में सक्षम होने के लिए एसक्यूएल के साथ पर्याप्त रूप से आश्वस्त / सक्षम नहीं हैं, लेकिन अगर ऐसा है तो उन्हें संबंधपरक मॉडल के डिजाइन के साथ कुछ भी नहीं करना चाहिए।
SQL Antipatterns (Karwin, 2010) इस एंटीपैर्टन (जिसे वह 'Jaywalking' कहते हैं) के एक पूरे अध्याय को समर्पित करता है, पृष्ठ 15-23। इसके अलावा, लेखक ने SO पर एक समान प्रश्न पर पोस्ट किया है । मुख्य बिंदु वह नोट करते हैं (जैसा कि इस उदाहरण पर लागू होता है) हैं:
- एक विशिष्ट श्रेणी में सभी सौदों के लिए क्वेरी करना जटिल है (उस समस्या को हल करने का सबसे आसान तरीका एक नियमित अभिव्यक्ति है, लेकिन एक नियमित अभिव्यक्ति अपने आप में एक समस्या है)।
- आप विदेशी कुंजी संबंधों के बिना संदर्भ अखंडता को लागू नहीं कर सकते। यदि आप DealCategory nr को हटाते हैं। # 26, आप तब, अपने आवेदन कोड में, प्रत्येक सौदे के माध्यम से जाने के लिए श्रेणी # 26 के संदर्भ की तलाश में हैं और उन्हें हटा दें। यह एक ऐसी चीज है जिसे डेटा लेयर पर संभाला जाना चाहिए, और इसे अपने एप्लिकेशन में संभालना बहुत बुरी बात है ।
- अलग-अलग प्रश्न (
COUNT
, SUM
आदि), फिर से, 'जटिल' से 'लगभग असंभव' तक भिन्न होते हैं। अपने डेवलपर्स से पूछें कि वे आपको उस श्रेणी के सौदों की संख्या की गणना के साथ सभी श्रेणियों की सूची कैसे प्राप्त करेंगे। एक उचित डिजाइन के साथ, यह SQL की चार लाइनें है।
- अपडेट अधिक कठिन हो जाते हैं (अर्थात आपके पास पांच श्रेणियों में एक सौदा है, लेकिन आप दो को निकालना चाहते हैं और तीन अन्य को जोड़ना चाहते हैं)। कि उचित डिजाइन के साथ SQL की तीन लाइनें हैं।
- आखिरकार आप
VARCHAR
सूची की लंबाई सीमाओं में भाग लेंगे । हालाँकि अगर आपके पास 4000 वर्णों से अधिक अल्पविराम वाली सूची है, तो संभावना है कि राक्षस वैसे भी नरक के रूप में धीमा होने वाला है।
- डेटाबेस से एक सूची खींचना, इसे अलग करना, और फिर किसी अन्य क्वेरी के लिए डेटाबेस में वापस जाना आंतरिक रूप से एक क्वेरी की तुलना में धीमा है।
TLDR: यह एक मौलिक रूप से त्रुटिपूर्ण डिजाइन है, यह अच्छी तरह से पैमाने पर नहीं होगा, यह सरलतम प्रश्नों के लिए अतिरिक्त जटिलता का परिचय देता है, और सही आउट-ऑफ-द-बॉक्स यह आपके आवेदन को धीमा कर देता है।