एकाधिक एसक्यूएल टेबल की गतिशील खोज के लिए पैटर्न की आवश्यकता है

मैं कई तालिकाओं पर गतिशील खोज करने के लिए एक पैटर्न की तलाश में हूं।

मेरे पास विरासत (और खराब डिजाइन) डेटाबेस तालिका संरचना पर कोई नियंत्रण नहीं है।

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

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


Yeah, so I've started down the path of dynamically building the sql in code. Seems godawful. If I really try to support the requested ability to query any combination of any field in any table this is going to be one MASSIVE set of if statements. shiver


मुझे विश्वास है कि मैंने पढ़ा है कि COALESCE केवल तभी काम करता है जब आपके डेटा में न्यूल शामिल न हों। क्या वो सही है? यदि ऐसा है, तो नहीं, क्योंकि मेरे पास जगह पर कुल मूल्य हैं।

0
ro fr bn

3 उत्तर

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

0
जोड़ा

जहां तक ​​मैं समझता हूं (और मैं भी वह व्यक्ति हूं जिसने एक भयानक विरासत डेटाबेस के खिलाफ लिखा है), गतिशील WHERE खंडों जैसी कोई चीज नहीं है। इसे हल नहीं किया गया है।

निजी तौर पर, मैं कोड में अपनी गतिशील खोज उत्पन्न करना पसंद करता हूं। परीक्षण सुविधाजनक बनाता है। ध्यान दें, जब आप कोड में अपने एसक्यूएल प्रश्न बनाते हैं, तो उपयोगकर्ता इनपुट में संयोजित न करें। अपने @ variables का प्रयोग करें!

COALESCE ऑपरेटर का उपयोग करने का एकमात्र विकल्प है। मान लें कि आपके पास निम्न तालिका है:

Users
-----------
Name nvarchar(20)
Nickname nvarchar(10)

और आप वैकल्पिक रूप से नाम या उपनाम के लिए खोजना चाहते हैं। निम्नलिखित क्वेरी यह करेगी:

SELECT Name, Nickname
FROM Users
WHERE
    Name = COALESCE(@name, Name) AND
    Nickname =  COALESCE(@nick, Nickname)

यदि आप कुछ खोजना नहीं चाहते हैं, तो बस एक शून्य में पास करें। उदाहरण के लिए, निम्नलिखित नाम में @nick परिणामों के लिए @name और null के लिए "ब्रायन" में गुजरना निम्न क्वेरी का मूल्यांकन किया जा रहा है:

SELECT Name, Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

सहकर्मी ऑपरेटर शून्य पहचान को पहचान मूल्यांकन में बदल देता है, जो हमेशा सत्य होता है और जहां खंड को प्रभावित नहीं करता है।

0
जोड़ा

आपको जो चाहिए वह कुछ है जैसे स्फिंक्सशर्च (MySQL के लिए) या अपाचे लुसीन

जैसा कि आपने अपने उदाहरण में कहा था कि एक रेज़्यूमे की कल्पना करें जो कई क्षेत्रों से बना होगा:

  • सूची आइटम
  • नाम,
  • प्रशंसा,
  • शिक्षा (यह स्वयं की एक तालिका हो सकती है) या
  • कार्य अनुभव (यह अपनी तालिका में बढ़ सकता है जहां प्रत्येक पंक्ति पिछली नौकरी का प्रतिनिधित्व करती है)

तो उन सभी क्षेत्रों में एक शब्द खोजना जहां कई जॉइन के साथ तेजी से एक बहुत लंबी क्वेरी बन जाती है।

इसके बजाय आप संदर्भ के अपने ढांचे को बदल सकते हैं और पूरे रेज़्यूमे के बारे में सोच सकते हैं कि यह एक एकल दस्तावेज़ है और आप बस उस दस्तावेज़ को खोजना चाहते हैं।

यह वह जगह है जहां स्फिंक्स सर्च जैसे टूल करते हैं। वे आपके 'दस्तावेज़' का एक पूर्ण पाठ अनुक्रमणिका बनाते हैं और फिर आप स्फिंक्स से पूछ सकते हैं और यह आपको वापस डेटाबेस देगा जहां रिकॉर्ड किया गया था।

वास्तव में अच्छे खोज परिणाम।

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

0
जोड़ा