2015-02-17 35 views
13

Bir web uygulamasında ilk kez Cassandra'yı kullanıyorum ve bir sorgu sorunum var. İşte benim sekmesi: Her İstek üzerinecassandra birincil anahtar sütunu kısıtlanamaz

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

, benim bölüm anahtar, doodle_id göstermektedir.

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

Ama geçen istek üzerine yaptığım: Örneğin ben herhangi bir sorun olmadan yapabilirsiniz

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

aldığım aşağıdaki hata:

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

Birlikte yeniyim Cassandra, ama eğer yanılıyorsam düzeltin, birleşik bir ana anahtarda, ilk kısım Cassandra'nın veriyi nerede arayacağını bilmesine izin vermek için gerekli olan PARTITION KEY. Sonra, diğer parçalar veri sıralamak için KÜME ANAHTARI.

Ama hala ilk isteğimin neden işe yaradığını anlamıyorum, ikincisi değil?

Herhangi biri yardımcı olabilirse, bu büyük bir zevk olacaktır.

cevap

9

Cassandra'da, veri modelinizi sorgularınıza uyacak şekilde tasarlamalısınız. Bu nedenle, ikinci sorgunuzu (doodle_id ve schedule_id numaralı sorguları, ancak user_id ile zorunlu değil) desteklemek için uygun yol, belirli bir sorguyu işlemek için yeni bir tablo oluşturmaktır. PRIMARY KEY biraz farklı olacaktır hariç Bu tablo hemen hemen aynı olacak:

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

Şimdi bu sorgu çalışır:

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

Bu ALLOW FILTERING belirtmek zorunda yayılıyor.ALLOW FILTERING belgesine güvenmek asla iyi bir fikir değildir ve kesinlikle bir üretim kümesinde yapmanız gereken bir şey değildir.

+0

İki cevap için çok teşekkürler! Şimdi Cassandra'nın nasıl çalıştığını biraz daha iyi anlıyorum. Bu yüzden, sorgularımı ele aldığınız için yeni bir tablo oluşturdum ve şimdi iyi çalışıyor. – Orodan

+0

ve doodleid'de> ve

+0

@ParthTrivedi 'doodle_id' üzerinde bir aralıklı sorgulama yapmak için, farklı bir bölüm anahtarı ile yeni bir tablo oluşturmanız gerekir (verileriniz için neyin mantıklı olduğunu öğrenin). Ardından, belirli bir bölüm anahtarı için 'doodle_id' aralığını sorgulayabilirsiniz. – Aaron

3

Kümeleme anahtarı, belirli bir bölüm içindeki sütunları bulmak için de kullanılır. senin modeli ile, tarafından sorgulamak mümkün olacak:

  • doodle_id
  • doodle_id/user_id
  • doodle_id/user_id/schedule_id
  • ALLOW FILTERING
  • user_id/schedule_id kullanarak kullanarak user_id ALLOW FILTERING

Ana anahtarınızı bir dosya yolu doodle_id # 123/user_id # 456/schedule_id # 789 olarak görebilirsiniz. veriler en derin klasörde saklanır (ör. schedule_id # 789). Sorgulama yaparken, aramaya başladığınız yerden alt klasörü/alt ağacı belirtmeniz gerekir.

İkinci sorgunuz, sütunların bölüm içinde nasıl düzenlendiğinden dolayı çalışmaz. Cassandra aralıklı oldukları için bölüm içinde sürekli dilim sütunları alamıyor.

Sorgunuzu çalıştırabilmeniz için birincil anahtar sırasını (doodle_id, schedule_id, user_id) tersine çevirmelisiniz.