2008-09-15 12 views
7

कार्य: विभिन्न आरडीबीएमएस के लिए उपयुक्त डेटाबेस रिकॉर्ड का पेजिंग लागू करें। विधि मुख्यधारा के इंजनों के लिए काम करना चाहिए - एमएसएसक्यूएल 2000 +, ओरेकल, माईएसक्ल, इत्यादिडेटाबेस इंजन स्वतंत्र पेजिंग को कैसे कार्यान्वित करें?

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

संपादित करें:
मैं एसक्यूएल समाधान के लिए देख रहा हूँ, नहीं 3 पार्टी पुस्तकालय।

उत्तर

5

एसक्यूएल विनिर्देशों में मानक के रूप में पेजिंग शामिल होने पर एक सार्वभौमिक समाधान होता। किसी भी आरडीबीएमएस भाषा को आरडीबीएमएस भाषा कहा जाने की आवश्यकता में पेजिंग समर्थन भी शामिल नहीं है।

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

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

+0

हाँ प्राप्त करने के लिए ऊपर दिए गए मेरे संपादन को देखें, मैंने अलग-अलग समाधानों का प्रयास किया, लेकिन ऐसा लगता है कि कम या ज्यादा पोर्टेबल संस्करण बनाना असंभव प्रतीत होता है। – aku

0

सबसोनिक आप के लिए यह कर सकते हैं आप आप मुक्त स्रोत बर्दाश्त कर सकते हैं, तो अगर ... http://subsonicproject.com/querying/webcast-using-paging/

अन्य कि तुलना में मैं जानता हूँ कि NHib रूप में अच्छी तरह

0

जेपीए आप क्वेरी वर्ग के साथ यह करने की सुविधा देता है:

Query q = ...; 
q.setFirstResult (0); 
q.setMaxResults (10); 

आपको परिणाम सेट में पहले 10 परिणाम देता है।

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

3

पेजिंग करने का सबसे प्राकृतिक और कारगर तरीका LIMIT/OFFSET (साइबेस दुनिया में शीर्ष) का उपयोग कर रहा है। एक डीबींडेंटेंटेंट तरीके से यह जानना होगा कि यह कौन सा इंजन चल रहा है और उचित SQL निर्माण लागू करें।

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

यदि आप वास्तव में एक एकल, एक एसक्यूएल वाक्य समाधान की तलाश में हैं, तो क्या आप दिमाग में क्या दिखा सकते हैं? अस्थायी तालिका समाधान के लिए एसक्यूएल की तरह। इससे आपको अधिक प्रासंगिक सुझाव मिलेंगे।

संपादित करें:

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

तो सवाल अब और अधिक होगा "क्या LIMIT/OFFSET या समकक्ष का उपयोग किए बिना पेजिंग को लागू करने का कोई तरीका है?" और मुझे लगता है कि जवाब "संवेदना, नहीं।" आप कर्सर का उपयोग करने का प्रयास कर सकते हैं लेकिन आप वहां डेटाबेस विशिष्ट वाक्यों/व्यवहार का भी शिकार करेंगे।

एक वैको (बेवकूफ पढ़ा गया विचार) जो कि मेरे पास हुआ है, तालिका में एक पृष्ठ कॉलम जोड़ना होगा, टेबल टेस्ट टेस्ट (आईडी int, नाम वर्कर, फोन वर्कर, पृष्ठ int) कहें और फिर आप पेज प्राप्त कर सकते हैं 1 तालिका से चयन * के साथ जहां पृष्ठ = 1. लेकिन इसका मतलब है कि कॉलम को बनाए रखने के लिए कोड जोड़ना है, जिसे फिर से पूरे डेटाबेस को लाने या डेटाबेस विशिष्ट संरचनाओं का उपयोग करके किया जा सकता है। इसके अलावा प्रत्येक संभावित आदेश और कई अन्य त्रुटियों के लिए एक अलग कॉलम जोड़ने के अलावा।

मैं सबूत प्रदान नहीं कर सकता, लेकिन मुझे सच में लगता है कि आप इसे आसानी से नहीं कर सकते हैं।

1

के रूप में हमेशा की तरह आगे बढ़ें: मानक के अनुसार यह लागू करने से
प्रारंभ। और फिर कोने के मामलों को संभालें, यानी डीबीएमएस जो मानक लागू नहीं करते हैं। कोने के मामलों को कैसे संभालें अपने विकास पर्यावरण पर निर्भर करता है।

आप एक "सार्वभौमिक" दृष्टिकोण की तलाश में हैं। पेजिनेट करने का सबसे सार्वभौमिक तरीका कर्सर के उपयोग के माध्यम से होता है, लेकिन कर्सर-आधारित अंकन एक गैर-राज्य वातावरण जैसे वेब अनुप्रयोग के साथ बहुत अच्छी तरह से फिट नहीं होता है।

मैं मानक और कार्यान्वयन (कर्सर सहित) के बारे में लिखा है यहाँ: http://troels.arvin.dk/db/rdbms/#select-limit-offset

+0

ट्रॉल्स अरविन, बहुत उपयोगी पृष्ठ, धन्यवाद! – aku

0

@Vinko Vrsalovic,

के रूप में मैं प्रश्न में लिखा था मैं कैसे सबसे डीबीएस में यह करने के लिए पता है। मुझे सार्वभौमिक समाधान क्या मिलना है या यह सबूत प्राप्त करना है कि यह अस्तित्व में नहीं है।

अस्थायी तालिका के आधार पर यहां एक बेवकूफ समाधान है। यह स्पष्ट रूप से बुरा है, इसलिए इस पर टिप्पणी करने की कोई आवश्यकता नहीं है।

N - upper bound 
M - lower bound 

create #temp (Id int identity, originalId int) 

insert into #temp(originalId) 
select top N KeyColumn from MyTable 
where ... 

select MyTable.* from MyTable 
join #temp t on t.originalId = MyTable.KeyColumn 
where Id between M and M 
order by Id asc 

drop #temp 
+0

इस दृष्टिकोण के साथ समस्या यह है कि हालांकि पहचान मानक एसक्यूएल है, यह सभी डेटाबेस में उपलब्ध नहीं है। साथ ही, SELECT TOP न तो मानक एसक्यूएल है, न ही व्यापक रूप से लागू किया गया है। इसके अलावा, डेटा की प्रतिलिपि उन विधियों की तुलना में बहुत धीमी गति से हो सकती है जो अस्थायी तालिका का उपयोग नहीं करते हैं। –

+0

शायद एक अस्थायी तालिका बनाने के बजाय एक दृश्य लागू किया जा सकता है? क्या आप एक दृश्य बना सकते हैं जहां कॉलम में से एक पहचान कॉलम है? –

+0

@ 1800 जानकारी, क्या आप एक उदाहरण – aku

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