2016-04-13 33 views
0

Cassandra'da birden çok satıcıya ait ürün verilerini saklıyorum ve bireysel bir ürünü veya bir satıcıya ait tüm ürünleri alabilmeyi istersek, bu tablodaki düşük kardinalite bölüm anahtarını nasıl önleyebilirim? Örneğin,Cassandra'da düşük kardinalite bölüm anahtarını nasıl önleyebilirim?

CREATE TABLE products (
    merchant_id uuid, 
    product_id text, 
    description text, 

    PRIMARY KEY (merchant_id, product_id) 
); 

Bildiğim kadarıyla o çalışır, ancak ben tüccar az sayıda varsa (onlarca demek) sorunu ve ürünler (milyon) çok sayıda vardır, anladığımız kadarıyla, Veri düğümler arasında çok iyi dağıtılmayacaktır.

ben ile geldim geçici çözüm

şudur: Bu durumda

CREATE TABLE products (
    product_id text, 
    merchant_id uuid, 
    description text, 

    PRIMARY KEY (product_id) 
); 

CREATE INDEX ON products (merchant_id); 

, ürün kimliği özel olması için değerin başına tüccar kimliği vardır. Bu hacky gibi görünüyor. Ayrıca ikincil endekste yapılan bir aramanın milyonlarca birincil tuşa dönüşeceğinden endişe duyuyorum.

Burada yapılması gereken doğru şey nedir? Gelişim için oldukça erkenyim, bu yüzden gerekirse önemli şema değişikliklerine açığım ve Cassandra için Doğru Yolu bir şeyler yapmak istiyorum.

cevap

0

Hile, bir bileşik bölüm anahtarı oluşturmaktır. Eğer kategoriye içine tüm ürünleri sıralamak ve yeterli kategoriler (binlerce) orada olabilir, o zaman Aksi takdirde PRIMARY KEY((merchand_id, category), product_id)

oluşturabilir, sizin okuma deseni nedir?

Özgün tasarımınız PRIMARY KEY((merchand_id), product_id), tüm ürünlerini listelemek istediğiniz anlamına gelir, bu gerekli bir iş mi gerektiriyor? Değilse

, sadece yanı PRIMARY KEY(product_id)

+0

Evet, bu doğru kullanabilirsiniz - bu tablo için okunan desen (bir feed oluşturmak için) bir tüccar için tüm ürünleri okumaktır. – Derecho