2016-02-22 41 views
1

我已閱讀here,對於像表:卡桑德拉表查詢和主鍵唯一

CREATE TABLE user (
    username text, 
    password text, 
    email text, 
    company text, 
    PRIMARY KEY (username) 
); 

我們可以創建這樣一個表:

CREATE TABLE user_by_company (
    company text, 
    username text, 
    email text, 
    PRIMARY KEY (company) 
); 

爲了通過公司支持查詢。但是第二個表的主鍵唯一性呢?

+0

我想你想要的是'PRIMARY KEY(公司,用戶名)' – Ralf

+0

不是一個好主意,因爲數據將通過節點上的公司名稱進行分區。如果一個公司有很多用戶,而另一個公司則很少。數據將以非平衡的方式分區 – farhawa

+1

那麼你的查詢模式是什麼?您可以在公鑰和用戶名中包含公鑰。或電子郵件。這真的取決於你的查詢模式。 – Ralf

回答

1

修改你的表的主鍵的定義,並添加username作爲聚集關鍵字:

CREATE TABLE user_by_company (
    company text, 
    username text, 
    email text, 
    PRIMARY KEY (company,username) 
); 

這將強制唯一性,以及回報所有的用戶名特定公司。此外,您的結果集將按照username的升序排序。

數據將通過節點上的公司名稱進行分區。如果一個公司有很多用戶,而另一個公司則很少。數據將以非平衡的方式分區

這就是你必須自己計算出來的餘額。 Cassandra中的PRIMARY KEY定義是數據分發和查詢靈活性之間的一種交換。除非company的基數非常低(如單個數字),否則不必擔心在集羣中創建熱點。另外,如果某個特定的公司變得太大,您可以使用稱爲「bucketing」的建模技術。如果我要「桶」你user_by_company表,我會首先添加company_bucket列,並將它作爲附加(複合)分區鍵:

CREATE TABLE user_by_company (
    company text, 
    company_bucket text, 
    username text, 
    email text, 
    PRIMARY KEY ((company,company_bucket),username) 
); 

至於放什麼成桶,它是由您。也許這特定的公司有東,西的位置,所以這樣的事情可能工作:

INSERT INTO user_by_company (company,company_bucket,username,email) 
    VALUES ('Acme','West','Jayne','[email protected]'); 

這裏的缺點是,你將不得不提供company_bucket每當查詢該表。但如果公司應該變得太大,這是一個可以幫助你的解決方案。

1

我認爲博客中存在錯字(您提到的鏈接)。你是正確的表結構作爲user_by_company將有唯一性的問題。

爲了支持錯字理論:

在這種情況下,在 用戶表創建在公司領域的輔助索引可能是一個解決方案,因爲它具有非常低的基數 不是用戶的電子郵件,但讓我們在考慮到性能的情況下解決它。 二級索引總是比專用表方法慢。

這是博客中提到的用於按公司查詢用戶的行。 如果您要將公司定義爲主鍵或主鍵的一部分,則不需要創建二級索引。