1

我是 cassandra 的新手,还没有运行它,但是我的业务逻辑需要创建这样的表。

CREATE TABLE Index( 
  user_id uuid, 
  keyword text, 
  score text, 
  fID int, 
  PRIMARY KEY (user_id, keyword, score); ) 
WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;

有没有可能?我只有一列(fID),它不是我的复合索引的一部分,所以我希望我能够应用 compact_storage 设置。请注意我按复合索引的第三列而不是第二列排序。我还需要压缩存储空间,因此不会为每个 fID 重复关键字。

4

1 回答 1

0

最初关于您的CREATE TABLE陈述的一些事情:

  1. ;它会在您的 PRIMARY KEY 定义之后 的分号 ( ) 上出错。
  2. 您将需要选择一个新名称,保留字Index也是如此。

请注意我按复合索引的第三列而不是第二列排序。

  1. 指定 时不能跳过集群键CLUSTERING ORDER

但是,我确实在这里看到了一个选项。根据您的查询要求,您可以简单地重新排序keywordscore在您的 PRIMARY KEY 定义中,然后它会起作用:

CREATE TABLE giveMeABetterName(
  user_id uuid, 
  keyword text, 
  score text, 
  fID int, 
  PRIMARY KEY (user_id, score, keyword)
) WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;

这样,您可以查询,user_id并且该用户的行(关键字?)将按以下顺序排序score

SELECT * FROM giveMeABetterName WHERE `user_id`=1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4;

如果这对您的业务逻辑不起作用,那么您可能需要修改您的数据模型。但是在指定CLUSTERING ORDER.

编辑

但是重新排序列对我不起作用。我可以做这样的事情吗WITH CLUSTERING ORDER BY (keyword asc, score desc)

让我们看看这里的一些选项。我用你原来的 PRIMARY KEY 创建了一个表,但是使用了这个 CLUSTERING ORDER。这在技术上是可行的,但看看它如何处理我的示例数据(视频游戏关键字):

aploetz@cqlsh:stackoverflow> SELECT * FROM givemeabettername WHERE user_id=dbeddd12-40c9-4f84-8c41-162dfb93a69f;
 user_id                              | keyword          | score | fid
--------------------------------------+------------------+-------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f | Assassin's creed |    87 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    Battlefield 4 |     9 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |      Uncharted 2 |    91 |   0

(3 rows)

另一方面,如果我将 PRIMARY KEY 更改为score首先群集(并相应地调整 CLUSTERING ORDER),相同的查询将返回:

 user_id                              | score | keyword          | fid
--------------------------------------+-------+------------------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    91 |      Uncharted 2 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    87 | Assassin's creed |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |     9 |    Battlefield 4 |   0

请注意,您需要将数据类型score从 TEXT 更改为数字 (int/bigint) 以避免 ASCII-betical 排序,如下所示:

 user_id                              | score | keyword          | fid
--------------------------------------+-------+------------------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    91 |      Uncharted 2 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |     9 |    Battlefield 4 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    87 | Assassin's creed |   0

可能对您有所帮助的是通读有关Compound Keys and Clustering的 DataStax 文档。

于 2015-02-26T19:32:46.053 回答