पृष्ठांकन जब अपनी सामग्री रैंकिंग जल्दी से बदल सकते हैं, और भी कठिन है जब उन रैंकिंग प्रति-उपयोगकर्ता अलग कठिन है। (आइए असीमित स्क्रॉल को पेजिनेशन के प्रकार के रूप में देखें जहां लिंक अदृश्य हैं।) दो कठोर समस्याएं हैं: शीर्ष पर जोड़े गए सामग्री और पुन: संग्रहित सामग्री।क्या पेजिनेशन योजनाएं तेजी से बदलती सामग्री सूचियों को संभाल सकती हैं?
के नव-वर्द्धित सामग्री के बारे में भूल करते हैं, और स्वीकार करते हैं कि आप पेज 1 ताज़ा करने के लिए यह देखने के लिए होगा। आइए यह भी दिखाएं कि हम शुद्ध ORDER BY position
कर रहे हैं; अगर आप किसी और चीज से ऑर्डर कर रहे हैं, तो आपको विंडो फ़ंक्शंस का उपयोग करना पड़ सकता है। हमारे पृष्ठों में प्रति पृष्ठ जानवरों की 4 पंक्तियां हैं। वे शुरू करते हैं:
+----+----------+-----------+
| id | position^| animal |
+----+----------+-----------+
| 1 | 1 | Alpacas |
| 2 | 2 | Bats |
| 3 | 3 | Cows |
| 4 | 4 | Dogs |
| 5 | 5 | Elephants |
| 6 | 6 | Foxes |
| 7 | 7 | Giraffes |
| 8 | 8 | Horses |
+----+----------+-----------+
पृष्ठ 1 लाने के बाद, और पृष्ठ 2 लाने से पहले, बहुत सारी चीज़ें घूमती हैं। डीबी अब है:
+----+----------+-----------+
| id | position^| animal |
+----+----------+-----------+
| 4 | 1 | Dogs |
| 2 | 2 | Bats |
| 1 | 3 | Alpacas |
| 5 | 4 | Elephants |
| 6 | 5 | Foxes |
| 7 | 6 | Giraffes |
| 3 | 7 | Cows |
| 8 | 8 | Horses |
+----+----------+-----------+
तीन आम तरीके हैं:
ऑफसेट/सीमा दृष्टिकोण
यह विशिष्ट अनुभवहीन दृष्टिकोण है, रेल में, यह will_paginate और Kaminari काम करता है। अगर मैं पेज 2 लेना चाहता हूं, तो मैं
SELECT * FROM animals
ORDER BY animals.position
OFFSET ((:page_num - 1) * :page_size)
LIMIT :page_size;
जो पंक्तियों 5-8 हो जाएगा। मैं हाथियों को कभी नहीं देखूंगा, और मैं गायों को दो बार देखूंगा।
अंतिम आईडी दृष्टिकोण देखा
रेडिट अलग तरीका अपनाते हैं। पृष्ठ आकार के आधार पर पहली पंक्ति की गणना करने के बजाय, ग्राहक आपके द्वारा देखी गई अंतिम वस्तु की आईडी ट्रैक करता है, जैसे बुकमार्क। जब आप "अगला" मारा, वे कहते हैं कि बुकमार्क से आगे देख शुरू:
SELECT * FROM animals
WHERE position > (
SELECT position FROM animals
WHERE id = :last_seen_id
)
ORDER BY position
LIMIT :page_size;
कुछ मामलों में, यह पेज/ऑफसेट की तुलना में बेहतर काम करता है। लेकिन हमारे मामले में, आखिरी देखी गई पोस्ट कुत्तों ने # 1 तक ज़ूम किया। तो ग्राहक ?last_seen_id=4
भेजता है, और मेरा पृष्ठ 2 बैट्स, अल्पाकास, हाथी और फॉक्स है। मैंने किसी जानवर को याद नहीं किया है, लेकिन मैंने दो बार बल्ले और अल्पाका को देखा।
सर्वर साइड राज्य
HackerNews (और हमारी साइट, अभी) सर्वर साइड निरंतरता के साथ इस को हल करती है; वे आप के लिए पूरे परिणाम सेट की दुकान (या कम से कम कई पृष्ठों?), और "अधिक" लिंक संदर्भ निरंतरता। जब मैं पेज 2 लाता हूं, तो मैं "मेरी मूल क्वेरी के पेज 2" के लिए पूछता हूं। यह एक ही ऑफ़सेट/सीमा गणना का उपयोग करता है, लेकिन चूंकि यह मूल क्वेरी के खिलाफ है, इसलिए मुझे बस परवाह नहीं है कि चीजें अब घूमती हैं। मैं हाथियों, फॉक्स, Giraffes, और घोड़े देखता हूँ। कोई डुप्लिकेट नहीं, कोई मिस्ड आइटम नहीं।
नकारात्मक पक्ष यह है कि हम सर्वर पर राज्य का एक बहुत स्टोर करने के लिए होता है। HN पर, कि रैम में संग्रहित है, और वास्तव में उन निरंतरता अक्सर समय सीमा समाप्त होने से पहले आप "अधिक" बटन दबा सकते हैं, आप सभी तरह से वापस पेज 1 के मान्य लिंक को खोजने के लिए जाने के लिए मजबूर कर दिया। अधिकांश अनुप्रयोगों में, आप इसे मेमकैच में या यहां तक कि डेटाबेस में भी संग्रहीत कर सकते हैं (अपनी तालिका का उपयोग करके, या ओरेकल या पोस्टग्रेएसक्यूएल में, होल्ड करने योग्य कर्सर का उपयोग करके)। आपके आवेदन के आधार पर, प्रदर्शन प्रदर्शन हो सकता है; PostgreSQL में, कम से कम, आपको सही डेटाबेस कनेक्शन को फिर से हिट करने का कोई तरीका ढूंढना होगा, जिसके लिए बहुत चिपचिपा-राज्य या कुछ चालाक बैक-एंड रूटिंग की आवश्यकता होती है।
क्या ये केवल तीन संभावित दृष्टिकोण हैं? यदि नहीं, तो क्या कंप्यूटर-विज्ञान अवधारणाएं हैं जो मुझे इस बारे में पढ़ने के लिए Google रस देगी? पूरे परिणाम सेट को संग्रहीत किए बिना निरंतरता दृष्टिकोण का अनुमान लगाने के तरीके हैं? दीर्घकालिक, जटिल घटना-स्ट्रीमिंग/पॉइंट-इन-टाइम सिस्टम है, जहां "पेज 1 लाए गए पल के परिणामस्वरूप परिणाम" हमेशा के लिए व्यर्थ है। उस से कम ...?
मैं इसे एक अलग कोण से देखने का सुझाव दूंगा। हो सकता है कि पेजिनेशन से बचने के लिए संभव है- केवल अनंत स्क्रॉल का उपयोग करें + कुछ व्यापक स्क्रिप्टिंग जो पेज रीलोड के बिना अपडेट सूची और उचित प्रदर्शित करता है ↑/↓ उपयोगकर्ता सुविधा के लिए प्रतीकों। यह आपके उपयोग के मामले पर निर्भर करता है, हालांकि। अपडेट किया गया: एफडब्ल्यूआईडब्ल्यू, यहां [एक संबंधित प्रश्न] है (http://ux.stackexchange.com/questions/2997/best-way-to-add-items-to-a-paginated-list/2999#2999) यूएक्स स्टैक एक्सचेंज से । – Tony
हाँ, यह हमारे उपयोग के मामले के लिए काम नहीं करता है ... चीजें लगातार पुन: क्रमबद्ध होती हैं, और आप नहीं चाहते कि डिस्प्ले लगातार अद्यतन हो। महान विचार, यद्यपि। –
आप क्लाइंट पर राज्य स्टोर कर सकते हैं, और देखे गए रिकॉर्ड के सभी आईडी भेज सकते हैं। –