2015-02-17 8 views
13

मैं वेब ऐप में पहली बार कैसंद्रा का उपयोग कर रहा हूं और मुझे एक क्वेरी समस्या मिली है। यहाँ मेरी टैब है:कैसंड्रा प्राथमिक कुंजी कॉलम प्रतिबंधित नहीं किया जा सकता

CREATE TABLE vote (
    doodle_id uuid, 
    user_id uuid, 
    schedule_id uuid, 
    vote int, 
    PRIMARY KEY ((doodle_id), user_id, schedule_id) 
); 

हर अनुरोध पर, मैं अपने विभाजन कुंजी, doodle_id संकेत मिलता है। उदाहरण के लिए मैं किसी भी समस्याओं के बिना कर सकते हैं:

select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and user_id = 97a7378a-e1bb-4586-ada1-177016405142; 

लेकिन पिछले अनुरोध पर मैंने बनाया:

select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633; 

मुझे मिल निम्न त्रुटि:

Bad Request: PRIMARY KEY column "schedule_id" cannot be restricted (preceding column "user_id" is either not restricted or by a non-EQ relation) 

मैं के साथ नए कर रहा हूँ कैसंद्रा, लेकिन अगर मैं गलत हूं, तो मुझे सही करें, एक समग्र प्राथमिक कुंजी में, पहला भाग पार्टिशन कुंजी है जो कैसंद्रा को यह जानने के लिए अनिवार्य है कि डेटा कहां देखना है। फिर अन्य भागों डेटा को सॉर्ट करने के लिए कुंजी को क्लस्टर कर रहे हैं।

लेकिन मुझे अभी भी नहीं पता कि मेरा पहला अनुरोध क्यों काम कर रहा है और दूसरा नहीं?

यदि कोई भी मदद कर सकता है तो यह बहुत खुशी होगी।

उत्तर

9

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

CREATE TABLE votebydoodleandschedule (
    doodle_id uuid, 
    user_id uuid, 
    schedule_id uuid, 
    vote int, 
    PRIMARY KEY ((doodle_id), schedule_id, user_id) 
); 

अब इस क्वेरी काम करेगा:

SELECT * FROM votebydoodleandschedule 
WHERE doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 
AND schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633; 

यह आप के आसपास ALLOW FILTERING निर्दिष्ट किए हो जाता है।ALLOW FILTERING पर निर्भर करना कभी भी एक अच्छा विचार नहीं है, और निश्चित रूप से कुछ ऐसा नहीं है जो आपको उत्पादन क्लस्टर में करना चाहिए।

+0

धन्यवाद दो उत्तरों के लिए बहुत कुछ! मैं अब थोड़ा बेहतर समझता हूं कि कैसे कैसंद्रा काम करता है। इसलिए मैंने अपनी क्वेरी को संभालने के लिए एक नई तालिका बनाई है और यह ठीक काम करता है। – Orodan

+0

और यदि मैं प्रदर्शन करना चाहता हूं> और <ऑपरेटर डूडलीड में तो मुझे टेबल कैसे बनाना चाहिए? –

+0

@ParthTrivedi 'doodle_id' पर एक रेंज क्वेरी करने के लिए आपको एक अलग विभाजन कुंजी के साथ एक नई तालिका बनाने की आवश्यकता होगी (पता लगाएं कि आपके डेटा के लिए क्या समझ में आता है)। फिर आप एक विशिष्ट विभाजन कुंजी के लिए 'doodle_id' की एक श्रृंखला से पूछ सकते हैं। – Aaron

3

क्लस्टरिंग कुंजी का उपयोग किसी दिए गए विभाजन के भीतर कॉलम खोजने के लिए भी किया जाता है। अपने मॉडल के साथ, आप क्वेरी करने के लिए से सक्षम हो जाएगा:

  • doodle_id
  • doodle_id/user_id
  • doodle_id/user_id/schedule_id
  • ALLOW FILTERING
  • user_id/schedule_id का उपयोग कर का उपयोग कर user_id ALLOW FILTERING

आप अपनी प्राथमिक कुंजी को फ़ाइल पथ doodle_id # 123/user_id # 456/schedule_id # 789 के रूप में देख सकते हैं, जहां सभी डेटा गहरे फ़ोल्डर में संग्रहीत किया जाता है (यानी schedule_id # 78 9)। जब आप पूछताछ कर रहे हों तो आपको उपफोल्डर/उपट्री को इंगित करना होगा जहां से आप खोजना शुरू कर देते हैं।

विभाजन के भीतर कॉलम व्यवस्थित किए जाने के कारण आपकी दूसरी क्वेरी काम नहीं करती है। Cassandra विभाजन में कॉलम के टुकड़ा टुकड़ा नहीं मिल सकता है क्योंकि वे interleaved हैं।

आपको अपनी क्वेरी चलाने में सक्षम होने के लिए प्राथमिक कुंजी ऑर्डर (doodle_id, schedule_id, user_id) को उलटा करना चाहिए।

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