रेंज क्वेरी एक संभावित प्रश्न है। वास्तविक श्रेणी क्वेरी करने का तरीका क्लस्टरिंग भाग पर सीमा बनाने, एक यौगिक प्राथमिक कुंजी का उपयोग करना है। चूंकि श्रेणी क्लस्टरिंग भाग पर है, इसलिए आप जिन प्रश्नों को आपने लिखा है, वे नहीं कर सकते हैं: आपको कम से कम विभाजन कुंजी पर समान स्थिति की आवश्यकता है। चलो एक उदाहरण देखें:
CREATE TABLE users (
mainland text,
state text,
uid int,
name text,
zip int,
PRIMARY KEY ((mainland), state, uid)
)
uid अब किसी पूर्णांक सिर्फ परीक्षण आसान
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'washington', 1, 'john', 98100);
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'texas', 2, 'lukas', 75000);
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'delaware', 3, 'henry', 19904);
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'delaware', 4, 'dawson', 19910);
insert into users (mainland, state, uid, name, zip) VALUES ('centraleurope', 'italy', 5, 'fabio', 20150);
insert into users (mainland, state, uid, name, zip) VALUES ('southamerica', 'argentina', 6, 'alex', 10840);
अब क्वेरी प्रदर्शन कर सकते हैं कि तुम क्या जरूरत है बनाने के लिए किया जाता है:
select * from users where mainland = 'northamerica' and state > 'ca' and state < 'ny';
आउटपुट
mainland | state | uid | name | zip
-------------+----------+-----+--------+-------
northamerica | delaware | 3 | henry | 19904
northamerica | delaware | 4 | dawson | 19910
यदि आप क्लस्टरिंग कुंजी के पहले कॉलम के रूप में एक int (आयु, ज़िपकोड) डालते हैं तो आप पूर्णांक की तुलना में वही क्वेरी कर सकते हैं।
देखभाल करें: इस स्थिति को देखते समय अधिकांश लोग सोचते हैं कि "ठीक है, मैं एक नकली विभाजन कुंजी डाल सकता हूं जो हमेशा समान होता है और फिर मैं रेंज क्वेरी कर सकता हूं"। यह एक बड़ी त्रुटि है, विभाजन कुंजी नोड्स में डेटा वितरण के लिए ज़िम्मेदार है। एक फिक्स विभाजन कुंजी सेट करना मतलब है कि सभी डेटा एक ही नोड (और इसकी प्रतिकृति में) में समाप्त हो जाएगा।
15/20 जोनों में विश्व क्षेत्र को विभाजित करना (15/20 विभाजन कुंजी रखने के लिए) कुछ है लेकिन पर्याप्त नहीं है और केवल वैध उदाहरण बनाने के लिए बनाया गया है।
संपादित करें: प्रश्न के संपादन की वजह से
मैंने ऐसा नहीं कहा कि यह केवल संभावना है; अगर आपको अपने उपयोगकर्ताओं को विभाजन करने का कोई वैध तरीका नहीं मिल रहा है और इस तरह की क्वेरी करने की आवश्यकता है तो यह एक संभावना है, केवल एक ही नहीं। रेंज क्वेरी क्लस्टरिंग कुंजी भाग पर किया जाना चाहिए। विभाजन कुंजी के रूप में एजीई का एक कमजोर बिंदु यह है कि आप उस पर एक अद्यतन नहीं कर सकते हैं, किसी भी समय आपको उस उपयोगकर्ता की उम्र को अपडेट करने की आवश्यकता होती है जब आपको एक डिलीट और एक डालने की ज़रूरत होती है (एक विकल्प जन्म_यायर/जन्म_डेट लिख सकता है और नहीं उम्र, और उसके बाद ग्राहक पक्ष की गणना करें)
द्वितीयक अनुक्रमणिका जोड़ने पर आपके प्रश्न का उत्तर देने के लिए: वास्तव में माध्यमिक अनुक्रमणिका पर प्रश्न ऑपरेटर में समर्थन नहीं करते हैं। CQL संदेश से ऐसा लगता है कि वे जल्द ही इसे विकसित करने के लिए जा रहे हैं
गलत अनुरोध: गैर-प्राथमिक कुंजी कॉलम (xxx) पर विधेय में अभी तक समर्थित
हालांकि भले ही नहीं है माध्यमिक सूचकांक ऑपरेटर में समर्थन आपकी क्वेरी बस मेरी अवधारणा को स्पष्ट करने से
select * from users where age IN (15,16,17,....30)
परिवर्तन नहीं होगा: कुछ भी है कि एक "स्वच्छ" और "तैयार" समाधान नहीं है उपयोगकर्ता के प्रयास में डेटा मॉडल करने के लिए की आवश्यकता है एक तरीका है कि सैटिस इसकी जरूरतों को पूरा करें। एक उदाहरण बनाने के लिए (कि मैं यह कहना नहीं एक अच्छा समाधान है: मैं इसका इस्तेमाल नहीं होता)
insert into users (years_range, age , uid) VALUES ('11_15', 14, 1);
insert into users (years_range, age , uid) VALUES ('26_30', 28, 3);
insert into users (years_range, age , uid) VALUES ('16_20', 16, 2);
insert into users (years_range, age , uid) VALUES ('26_30', 29, 4);
insert into users (years_range, age , uid) VALUES ('41_45', 41, 5);
insert into users (years_range, age , uid) VALUES ('21_25', 23, 5);
क्वेरी डेटा
select * from users where years_range in('11_15', '16_20', '21_25', '26_30') and age > 14 and age < 29;
उत्पादन
CREATE TABLE users (
years_range text,
age int,
uid int,
PRIMARY KEY ((years_range), age, uid)
)
कुछ डेटा डाल
years_range | age | uid
-------------+-----+-----
16_20 | 16 | 2
21_25 | 23 | 5
26_30 | 28 | 3
यह समाधान वाई हल कर सकता है हमारी समस्या और एक छोटे समूह में इस्तेमाल किया जा सकता है, जहां लगभग 20 कुंजी (0_5 ... 106_110) का एक अच्छा वितरण हो सकता है। लेकिन यह समाधान, पहले की तरह, एक अद्यतन की अनुमति नहीं देता है और कुंजी के वितरण को कम करता है। लाभ यह है कि आपके पास छोटे सेट हैं।
एक परिपूर्ण दुनिया में जहां एसआई पहले से ही खंड में अनुमति देता है, मैं यूयूआईडी को विभाजन कुंजी के रूप में उपयोग करता हूं, सालों के रूप में वर्ष_श्रेणी (जन्म_यायर_रेंज के रूप में सेट) और मेरे डेटा क्लाइंट पक्ष को "फ़िल्टर" करता हूं (यदि 10> आयु> 22 में रुचि है मैं IN('1991_1995', '1996_2000', '2001_2005', '2006_2010', '2011_2015')
के लिए पूछना होगा की गणना और अपने आवेदन पर unuseful वर्ष)
HTH, कार्लो
भी देखें https://stackoverflow.com/q/11348158/32453 – rogerdpack