我想執行使用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,如何執行電子郵件查詢?
我想執行使用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,如何執行電子郵件查詢?
我假設你也想在查詢中返回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)
我假設在上面的情況下,您是專門試圖通過電子郵件檢索用戶名。
答案很簡單:
有一個在卡桑德拉沒有辦法,你將能夠獲得來自電子郵件的用戶名,使用已定義的表結構單一的查詢。您需要查詢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;
基於您提供的表結構,我覺得用戶表也將具有唯一的電子郵件。所以爲什麼不把它作爲用戶表中的主鍵? –
可能因爲電子郵件地址可能會更改。 – Aaron