2013-07-18 16 views
7

में पंक्ति कुंजी के अलावा समग्र कुंजी का उपयोग कर क्वेरी, मैं CQL3 में पंक्ति कुंजी के अलावा समग्र कुंजी द्वारा डेटा फ़िल्टरिंग क्वेरी करना चाहता हूं। ये मेरी प्रश्नों हैं:कैसंड्रा

CREATE TABLE grades (id int, 
    date timestamp, 
    subject text, 
    status text, 
    PRIMARY KEY (id, subject, status, date) 
); 

जब मैं कोशिश करते हैं और डेटा का उपयोग,

SELECT * FROM grades where id = 1098; //works fine 
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine 
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error 

गलत अनुरोध: प्राथमिक महत्वपूर्ण हिस्सा स्थिति ही सीमित नहीं किया जा सकता है (पूर्ववर्ती हिस्सा विषय या तो सीमित नहीं है या एक गैर EQ संबंध)

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

क्या मैं कुछ गलत कर रहा हूं? क्या मैं CQL3 में किसी अन्य समग्र कुंजी का उपयोग कर डेटा से क्वेरी नहीं कर सकता? मैं कैसंड्रा 1.2.6 और सीक्यूएल 3 का उपयोग कर रहा हूं।

उत्तर

12

कैसंड्रा कंपोजिट कुंजी मॉडल (http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT) के अनुसार यह सामान्य व्यवहार दिखता है। कैसंद्रा डेटा मॉडल का लक्ष्य है (और यह सोचने का एक सामान्य नोएसक्यूएल तरीका है) यह पूछने पर कि प्रश्न निष्पादित हैं, जो आपके डेटा को स्टोर और अनुक्रमित करने के तरीके पर "प्रतिबंध" की कीमत पर आता है, और फिर आप इसे कैसे पूछते हैं, अर्थात् आप प्राथमिक कुंजी पर "हमेशा विषय के पिछले भाग को प्रतिबंधित करने की आवश्यकता है"।

आप क्वेरी पर प्राथमिक कुंजी सूची पर तत्वों को स्वैप नहीं कर सकते (जो कि सोचने का एक एसक्यूएल तरीका है)। यदि आप समग्र कुंजी के एकाधिक तत्वों का उपयोग करना चाहते हैं तो आपको हमेशा प्राथमिक कुंजी के पिछले तत्व को "बाध्य"/"प्रतिबंधित" करने की आवश्यकता है। इसका अर्थ यह है कि यदि आपके पास समग्र कुंजी = (आईडी, विषय, स्थिति, दिनांक) है और "स्थिति" से पूछना चाहते हैं, तो आपको "आईडी" और/या "विषय" (या "यदि आप उपयोग करते हैं तो" "फ़िल्टरिंग की अनुमति दें", यानी, आप केवल "विषय" को प्रतिबंधित कर सकते हैं और "आईडी" को प्रतिबंधित करने की आवश्यकता नहीं है)। इसलिए, यदि आप "स्थिति" पर क्वेरी करना चाहते हैं तो आप दो अलग-अलग तरीकों से पूछने में सक्षम होंगे:

ग्रेड से चुनें * आईडी = '10 9 3' और विषय = 'अंग्रेजी' और स्थिति = 'सक्रिय' ;

या

चयन * ग्रेड जहाँ विषय = 'अंग्रेजी' और स्थिति = 'सक्रिय' को छानने के लिए अनुमति देने से;

पहला विशिष्ट "छात्र" के लिए है, दूसरा विषय "सभी" छात्रों के लिए स्थिति = "सक्रिय" में दूसरा है।

+0

अच्छी व्याख्या! –

+0

समझ गया! धन्यवाद, यह अब मुझे और अधिक समझ में आता है। मुझे लगता है कि मैं अपने प्रश्नों के माध्यम से फिर से पुन: प्रयास करूंगा और देख सकता हूं कि मैं उन्हें कैसे ढूढ़ना चाहता हूं क्योंकि मुझे हमेशा स्थिति प्राप्त करने में सक्षम होने के लिए विषय को प्रतिबंधित करने की आवश्यकता नहीं है। – user988544

+0

मुझे बहुत मदद की! धन्यवाद – kn0x