2016-02-22 32 views
1

我想執行使用2個表的查詢:cassandra - 如何執行表查詢?

CREATE TABLE users(
    id_ UUID PRIMARY KEY, 
    username text, 
    email text, 
); 

CREATE TABLE users_by_email(
    id UUID, 
    email text PRIMARY KEY 
) 

在這種CAS,如何執行電子郵件查詢?

+0

基於您提供的表結構,我覺得用戶表也將具有唯一的電子郵件。所以爲什麼不把它作爲用戶表中的主鍵? –

+0

可能因爲電子郵件地址可能會更改。 – Aaron

回答

1

我假設你也想在查詢中返回username。你不能在Cassandra中加入表格。因此,要做到這一點,你必須是列添加到您的users_by_email表:

CREATE TABLE users_by_email(
    id UUID, 
    email text PRIMARY KEY, 
    username text, 
); 

然後,只需通過電子郵件地址查詢該表。

> SELECT id, email, username FROM users_by_email WHERE email='[email protected]'; 

id         | email     | username 
--------------------------------------+------------------------+---------- 
d8e57eb4-c837-4bd7-9fd7-855497861faf | [email protected] |  Mal 

(1 rows) 
2

我假設在上面的情況下,您是專門試圖通過電子郵件檢索用戶名。

答案很簡單:

有一個在卡桑德拉沒有辦法,你將能夠獲得來自電子郵件的用戶名,使用已定義的表結構單一的查詢。您需要查詢users_by_email以獲取該id,然後查詢用戶以獲取用戶名。更好的選擇是將用戶名列添加到users_by_email表。

龍答:

由於其在磁盤上的卡桑德拉存儲數據的唯一可用的參數,您可以在where子句必須在主鍵使用的基本機制。主鍵由2種不同類型的鍵組成。首先是分區密鑰,用於物理分隔磁盤上的文件和羣集中的節點之間的文件。其次是集羣密鑰,用於組織存儲在分區中的數據,並有助於高效地檢索數據。另一個需要注意的關鍵部分是,如果在查詢中使用WHERE子句,則每次調用都必須包含其中的所有分區鍵。這是爲了有效地檢索數據。如果你想在WHERE子句的工作的一些更詳細的信息,看看這個鏈接:

http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

現在你知道什麼WHERE子句是問題的侷限性,我們如何繞過他們。首先你需要知道的是Cassandra不是一個RDBMS,你不能對錶執行JOIN。這意味着我們需要忘記我們多年來所學習的所有規則,即如何正確地對數據庫中的數據進行標準化,並開始思考問題。一般來說,Cassandra是爲每個查詢表而設計的。這意味着對於每個要訪問的數據訪問模式(即查詢),將運行一個關聯表,其中包含該查詢的數據並具有適當的鍵以允許適當地過濾數據。我不會是能夠進入的所有細節問題細節如​​何正確數據模型的數據,但我建議你乘坐免費Datastax研究院數據建模過程avaliable這裏:

https://academy.datastax.com/courses/ds220-data-modeling

因此,正如我瞭解你的特殊需要,我認爲,你可以修改你的用戶表看起來像這樣:

CREATE TABLE users_by_email(
    email text, 
    username text, 
    id_ UUID, 
    PRIMARY KEY (email, username) 
); 

此表安裝程序將允許您使用查詢等選擇通過電子郵件的用戶名:

SELECT username FROM users_by_email WHERE email=XXXXX;