我是Cassandra的新手并尝试了解数据模型。所以,如果“bob”跟随“詹姆斯”,我知道如何插入。我也知道如何查询以获取所有关注“bob”的人的列表,我知道如何查询以获取“bob”跟随者的列表。
我的问题是,鉴于下面的内容,如果我想知道“bob”是否跟随“詹姆斯”,查询会是什么样子? (是或否)
这是正确的查询吗?
SELECT * FROM followers WHERE username="bob" AND following="james"
我是否需要在FOLLOWING上设置第二个索引才能执行上述查询?
-- User storage
CREATE TABLE users (username text PRIMARY KEY, password text);
-- Users user is following
CREATE TABLE following (
username text,
followed text,
PRIMARY KEY(username, followed)
);
-- Users who follow user
CREATE TABLE followers (
username text,
following text,
PRIMARY KEY(username, following)
);
答案 0 :(得分:1)
在这种情况下不需要二级索引。您总是可以使用cqlsh shell测试这样的快速创意。
cqlsh> use ks;
cqlsh:ks> CREATE TABLE followers (
... username text,
... following text,
... PRIMARY KEY(username, following)
... );
cqlsh:ks> INSERT INTO followers (username, following ) VALUES ( 'bob', 'james' );
cqlsh:ks> SELECT * FROM followers WHERE username='bob' and following='james';
username | following
----------+-----------
bob | james
您不必创建二级索引的原因(如果您希望大规模执行此类查询,也不应该这样做)是因为“follow”被指定为群集键。这意味着“跟随”描述了分区中数据的布局,这意味着我们可以非常快速地过滤“跟随”。
另外,如果频繁执行的查询需要二级索引(允许过滤),这表明您应该重新考虑数据模型。