7

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

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

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

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


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


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

उत्तर

5

जहां तक ​​मैं समझता हूं (और मैं भी एक व्यक्ति जो एक भयानक विरासत डेटाबेस के खिलाफ लिखा है), गतिशील 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) 

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

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

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

1

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

1

आपको जो चाहिए वह SphinxSearch (MySQL के लिए) या Apache Lucene जैसा कुछ है।

रूप में आप अपने उदाहरण में कहा की सुविधा देता है एक फिर से शुरू है कि कई क्षेत्रों से बना होगा कल्पना:

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

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

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

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

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

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