我和Cassandra(cql)一起玩。当我做一个SELECT时,它返回一个错误:
群集栏"域"不能被限制(前一列"时间戳"受非EQ关系的限制)。
列"域" (类型varchar)和"时间戳" (类型时间戳)是主键。
我只过滤"时间戳"像这样:
SELECT id, comment, language, location, section, domain, type, user, timestamp
FROM comments WHERE ts >= ? AND ts <= ? ALLOW FILTERING;
工作正常,但当我尝试过滤包括&#34;域&#34;给我那个错误:
SELECT id, comment, language, location, section, domain, type, user, timestamp
FROM comments WHERE domain=? AND ts >= ? AND ts <= ? ALLOW FILTERING;
CREATE TABLE CQL:
CREATE TABLE table (
id varchar,
type varchar,
section varchar,
comment text,
language varchar,
location text,
user int,
domain varchar,
timestamp timestamp,
PRIMARY KEY (id, timestamp, domain, user, section))
WITH CLUSTERING ORDER BY (timestamp DESC);
答案 0 :(得分:0)
需要注意的重要事项,但是对于Cassandra,您需要采用以查询为中心的数据建模方法。基本上,如果这是您需要支持的查询:
SELECT id, comment, language, location, section, domain, type, user, timestamp
FROM comments WHERE domain=? AND timestamp >= ? AND timestamp <= ?;
然后你的PRIMARY KEY应该被设计为支持:
PRIMARY KEY (domain, timestamp, user, section, id))
由于您不会在id
上查询,因此将它作为分区键(PRIMARY KEY定义中最左侧的键)是没有意义的。但是你可能仍然希望它成为密钥的一部分,以帮助确保唯一性。
注意:
ALLOW FILTERING
的查询性能很差,从不在生产系统上使用。domain
到id
的基数不是无限的(可能是)。为了超越分区上未绑定行增长的潜力,您可能希望通过将domain
与其他内容合并来“抢占”您的分区键。