grk*_*vlt 2 java cassandra cql3 datastax-java-driver
我一直在查看CQL 3.0 数据建模文档,该文档描述了带有标签的列系列歌曲,如下所示:
CREATE TABLE songs (
id uuid PRIMARY KEY,
title text,
tags set<text>
);
Run Code Online (Sandbox Code Playgroud)
我想获得所有具有特定标签的歌曲的列表,因此我需要添加适当的索引.
我可以title很容易地在列上创建索引,但是如果我尝试索引tags作为集合的列,如下所示:
CREATE INDEX ON songs ( tags );
Run Code Online (Sandbox Code Playgroud)
我从DataStax Java驱动程序1.0.4收到以下错误:
Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: Indexes on collections are no yet supported
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:269)
Run Code Online (Sandbox Code Playgroud)
根据JIRA问题CASSANDRA-4511,看起来这可以在更高版本的Cassandra(2.1)中修复.我目前正在使用Apache Cassandra 1.2.11,但不想升级.根据发行CASSANDRA-5615虽然在卡桑德拉1.2.6存在是支持自定义索引的集合.
问题是,唯一可用的文档说明:
Cassandra支持创建自定义索引,该索引供内部使用且超出本文档的范围.
但是,它确实暗示的语法如下:
CREATE CUSTOM INDEX ON songs ( tags ) USING 'class_name';
Run Code Online (Sandbox Code Playgroud)
什么是class_name我们在本CQL语句中指定?
有没有更好的方法来索引标签,以便我可以在歌曲表中查询具有特定标签的歌曲列表?
在我看来,你尝试这样做的方式不是在Cassandra中建模的最好方法.您可以根据查询而不是数据构建模型.如果您需要根据标签查找歌曲,则为此创建另一个表并复制数据.就像是 ...
CREATE TABLE tagged_songs (
tag varchar,
song_id uuid,
song_title varchar,
... anything else you might need with your songs here ...
PRIMARY KEY ((tag), song_id)
);
Run Code Online (Sandbox Code Playgroud)
Cassandra的前提是存储便宜.复制数据以满足您的查询.写入速度很快,写入相同的数据3,4,10次通常很好.
您还希望将您的歌曲标题和您需要的任何其他信息存储到此表中.您不想抓取大量ID并在阅读时尝试加入.这不是关系数据库.
当有人标记歌曲时,您可能希望将标记插入到集合中,并将其添加到tagged_songs表中.查询标签X的所有歌曲基本上是O(1).
| 归档时间: |
|
| 查看次数: |
1563 次 |
| 最近记录: |