Cassandra DataModel查询

时间:2014-01-12 16:28:41

标签: nosql cassandra cql

我是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)
);

1 个答案:

答案 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”被指定为群集键。这意味着“跟随”描述了分区中数据的布局,这意味着我们可以非常快速地过滤“跟随”。

另外,如果频繁执行的查询需要二级索引(允许过滤),这表明您应该重新考虑数据模型。