Cassandra数据模型执行列排序?

时间:2015-10-02 04:19:13

标签: database jdbc cassandra data-modeling

对于我正在处理的音乐服务应用程序,我有以下用例(后端cassandra)。

我的音乐数据存储区将包含艺术家,流派,年份,歌曲名称,观看次数,曲目长度,字节编码内容。我希望能够按艺术家过滤;艺术家和流派;艺术家,流派和年份。此外,我希望歌曲名称显示为按数字视图排序的降序。

我有下表:

MusicStore (
  artist text,
  genre text,  
  year text,
  songName text,
  views bigint
  tracklenght bigint,
  content text,

  PRIMARY KEY ((artist), genre, year, views, songName))
  WITH CLUSTERING ORDER BY (year DESC, views DESC, songName ASC);

我遇到的直接问题:

在我的应用中,我允许按艺术家和流派搜索:

select * from MusicStore  where artist='alizee' AND genre='pop' order by views

此查询不起作用。它说“Orderby目前只支持在主键中声明订单后列的排序”。

似乎只有第一个群集密钥才能使用orderby。我错过了什么?

对于几个用例,非规范化是可能的,但是由于Cassandra要求where子句键存在于主键中并且与查询的顺序相同,因此我会遇到同样的问题,因为我的应用程序按类型和年份搜索艺术家(类型,然后年份)和视图列是第一个聚类键是不可能的。使视图首先聚类密钥将需要其他所有内容作为分区键,因此在where子句中是必需的。

有关数据模型的任何建议吗?无论如何我可以通过使用thrift API使用列族(使用supercolumns)来避免这种情况吗?

1 个答案:

答案 0 :(得分:2)

从左到右应用聚类键 - 如果在WHERE中提供艺术家和流派,则可以按年份(升序,降序,等于或不等式 - >,<,> =,< =)进行排序

如果您还提供年份,则可以按视图排序(升序,降序,相等或不等)。

您不想使用超级列表,对于大多数用户来说,更难以理解thrift API。那里没有简单的魔法,排序就是它(基于sstable格式),并且thrift受到相同的限制。