2017-07-15 49 views
2

我有卡桑德拉表如下訪問卡桑德拉過濾允許需要添加

create table user(
id UUID PRIMARY KEY, 
firstname varchar, 
secondname varchar, 
emailid varchar, 
); 

從Java - 春天引導我試着去訪問數據

Optional<User> findByEmailid(String emailId); 

我得到錯誤提示

它要求我使用「過濾允許」部分查詢。無論如何要啓用這個全局或我應該改變查詢/數據庫結構?

回答

1

該錯誤告訴你,emailid不是可以在WHERE子句中過濾的有效列。啓用ALLOW FILTERING或在該列上創建輔助索引是執行此操作的一種方法。但這兩個都是非常糟糕的解決方案(因爲Cassandra的工作原理)。

隨着卡桑德拉你需要採取基於查詢的建模方法。這意味着有時(通常)查詢和表格共享1:1的比例。如果您確實需要通過電子郵件地址查詢用戶,則需要創建一個表來提供該查詢。

CREATE TABLE user_by_email(
    id UUID, 
    firstname varchar, 
    secondname varchar, 
    emailid varchar PRIMARY KEY, 
); 

然後像這樣將工作:

Optional<UserByEmail> findByEmailid(String emailId); 

如果你千萬不要對id查詢user表計劃,那麼是不是真的有一個理由去使用該列你唯一的主鍵。

+0

這是否意味着我應該始終使用PRIMARY KEY進行查詢?我無法過濾其他列? – syv

+0

@syv正確。總是需要使用您打算查詢的列來構建主鍵。 – Aaron

+0

謝謝。我詳細介紹了設計,有3個選項建議1.需要重新查看數據模型2.允許過濾器3.添加索引。 – syv