यह कुशलता से मॉडल करने के लिए एक अजीब मुश्किल बात है।
मुझे लगता है कि कैसंड्रा के माध्यमिक इंडेक्स का उपयोग करना (एक डमी अनुक्रमित मूल्य के साथ दुर्भाग्य से अभी भी इस समय जरूरी है) आपका सबसे अच्छा विकल्प है। आपको प्रति पंक्ति एक पंक्ति का उपयोग कम से कम तीन कॉलम के साथ करना होगा: 'स्टार्ट', 'एंड' और 'डमी'। इनमें से प्रत्येक पर एक माध्यमिक सूचकांक बनाएँ। पहले दो लॉन्ग टाइप हो सकते हैं और अंतिम बाइट्स टाइप हो सकता है। अधिक जानकारी के लिए this post on using secondary indexes देखें। चूंकि आपको द्वितीयक इंडेक्स क्वेरी (दुर्भाग्यपूर्ण आवश्यकता का उल्लेख किया गया) के लिए कम से कम एक कॉलम पर एक ईक्यू अभिव्यक्ति का उपयोग करना है, इसलिए ईक्यू 'डमी' पर होगा, जो हमेशा 0 पर सेट हो सकता है (इसका मतलब है कि ईक्यू इंडेक्स एक्सप्रेशन प्रत्येक पंक्ति से मेल खाएगा और अनिवार्य रूप से नो-ऑप होगा।) आप प्रारंभ, अंत और डमी के साथ पंक्ति में शेष ईवेंट डेटा स्टोर कर सकते हैं।
pycassa में, एक अजगर कैसेंड्रा ग्राहक, आपकी क्वेरी इस प्रकार दिखाई देगा:
from pycassa.index import *
start_time = 12312312000
end_time = 12312312300
start_exp = create_index_expression('start', start_time, GT)
end_exp = create_index_expression('end', end_time, LT)
dummy_exp = create_index_expression('dummy', 0, EQ)
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000)
for result in entries.get_indexed_slices(clause):
# do stuff with result
अन्य क्लाइंट में कुछ इसी तरह होनी चाहिए।
विकल्प जिसे मैंने पहले माना था ऑर्डरप्रेशिंग पार्टिशनर, जो लगभग हमेशा एक बुरी बात है। इंडेक्स के लिए, आप स्टार्ट टाइम को पंक्ति कुंजी और कॉलम नाम के रूप में फिनिश टाइम के रूप में उपयोग करेंगे। फिर आप start_key = start_time और column_finish = finish_time के साथ एक रेंज स्लाइस कर सकते हैं। यह प्रारंभ समय के बाद प्रत्येक पंक्ति को स्कैन करेगा और फिनिश_टाइम से पहले कॉलम के साथ ही उन्हें वापस कर देगा। बहुत कुशल नहीं है, और आपको एक बड़ा मल्टीगेट करना है, आदि। अंतर्निहित माध्यमिक सूचकांक दृष्टिकोण बेहतर है क्योंकि नोड केवल स्थानीय डेटा को इंडेक्स करेंगे और अधिकांश बॉयलरप्लेट इंडेक्सिंग कोड आपके लिए संभाला जाएगा।
स्रोत
2011-01-13 05:50:41